欢迎光临散文网 会员登陆 & 注册

基于LabWindows/CVI的RS232串口通信的实现

2022-05-01 14:21 作者:江南拱桥夜  | 我要投稿

       虚拟仪器(Virtual Instruments)是80年代末出现的概念,即在通用硬件平台上通过更改软件功能,设计出不同功能的测试仪器,能大幅缩短研发周期,降低成本。NI公司的LabWindows/CVI具有强大的图形界面设计功能,以ANSIC为核心,提供了丰富的库函数与仪器驱动。

      RS-232标准接口(又称EIA RS-232)是常用的串行通信接口标准之一,它是由美国电子工业协会(EIA)联合贝尔系统公司、调制解调器厂家及计算机终端生产厂家于1970年共同制定,其全名是“数据终端设备( DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准”。下面小编给大家介绍一下“rs232串口定义 ”。

      一、rs232串口定义

      在串行通讯时,要求通讯双方都采用一个标准接口,使不同的设备可以方便地连接起来进行通讯。RS-232-C接口(又称EIARS-232-C)是目前最常用的一种串行通讯接口。计算机串口(RS232)共有9个针脚,都是按顺序排列,各个针脚的定义如下:

        1、针脚1的定义 :

        载波检测(DCD) ,接收线信号检出(Received Line detection-RLSD)。

        2、针脚2 的定义:

       接受数据(RXD) ,为接收数据的引脚。

       3、针脚3 的定义:

       发出数据(TXD) ,为发送数据的引脚。

        4、针脚4的定义:

       数据终端准备好(DTR) ,数据终端就绪的首字母缩略词。

       5、针脚5的定义:

       信号地线(SG)

        6、针脚6的定义 :

       数据准备好(DSR) ,当调制/解调器启动时,在经过自身检测后,用DSR来声明已经准备就绪。

        7、针脚7的定义 :

        请求发送(RTS) ,取得发送信息。

        8、针脚8的定义:

       清除发送(CTS) ,清除数据。

        9、针脚9的定义 :

       振铃指示(RI) ,发出提示。

       二 、串口的相关函数:

       串口是一种常见的通信总线技术,其支持全双工模式,且只支持一对一的访问模式,大部分设备都支持串口通讯,可通过串口控制设备或采集数据。下面将介绍LabwindowsCVI对串口的支持。

       1、打开串口函数OpenComConfig,相关定义如下:

int OpenComConfig (int portNumber, char deviceName[], long baudRate, int parity, int dataBits, int stopBits, int inputQueueSize, int outputQueueSize);

——int portNumber  需要开启的串口号

——char deviceName[] 将要打开的串口号的名称,比如串口号1,名称为”COM1”

——long baudRate  设置串口读数的速度,波特率:110, 150, 300, 600,   1,200, 2,400, 4,800, 9,600, 14,400, 19,200, 28,800, 38,400, 56,000, 57,600, 115,200, 128,000, and 256,000,默认值为9600。

——int parity  选择串口的校验模式, Default Value: 0—no parity;Valid Values:0 = no parity,1 = odd parity,2 = even parity,3 = mark parity,4 = space parity

——int dataBits  数据位数   Default Value: 7 data bits;Valid Values: 5,6,7 or 8 data bits

——int stopBits  停止位  Default Value: 1 stop bit ;Valid Values: 1 or 2 stop bits

——int inputQueueSize   串口输入的数据量,一般选择的4,096

—— int outputQueueSize   串口输出的数据量,一般选择的4,096

      2、串口关闭函数CloseCom

      int CloseCom (int portNumber);

      int portNumber 是刚刚开启的串口号。在串口使用完后,要即使对串口关闭,避免在后面使用的时候,再次打开错误!

      3、设置超时函数SetComTime

       int SetComTime (int portNumber, double timeoutSeconds);

      int portNumber 为开启的串口号

      double timeoutSeconds 时间,单位为s

      此函数用在input/ouput数据的输入输出的时候,为读取操作设定一个时间限制,如果在这个时间段中,如果读取的数据位空,串口中数据为空的时候,没有完成读取,则时间溢出。

      4、写数据到串口ComWrt ,ComWrt Byte

   (1)int ComWrt (int portNumber, char buffer[], int count);

      功能:写一串数据到开启的串口的数据队列中去。数据位字符的形式传输。

      int portNumber 开启的串口号;

      char buffer[]存储待传输的数据;

      int count 数据的长度

        返回值:返回传输数据个数count表示传输成功,否则传输失败或没有传输完。

     (2)int ComWrtByte (int portNumber, int byte);

      功能:写一个int byte数据到int portNumber串口中去。

      虽然写的数据为int型,但是被传输出去的仅仅是int型数据的低8位,高8位字符自动屏蔽,为0。

      5、读取串口数据ComRd,ComRdByte

   (1)int ComRd (int portNumber, char buffer[], int count);

      功能:将串口portNumber的输入队列中读取conut个数据到buffer中存储,返回值:读取正确返回数据的个数count,否则返回值错误!

   (2)int ComRdByte (int portNumber);

      功能:从串口号portNumber的输入队列中读取一个数据,并保存为int类型,读取的为一个char型的数据,即将8位的数据存在int型的低8位中。

        三 、RS232串口编程实例:

        利用LabWindows/CVI的RS-232函数库进行串口应用程序进行编程时,主要包括以下几个步骤:首先要对串行口进行配置,然后利用该串行口进行收发数据,程序结束之前应当关闭该串行口。本实例利用同步方式进行RS-232串口数据传输,实例所用的设备为γ辐射个人剂量当量监测仪,该设备通过micro usb接口数据线与计算机连接,程序前面板如下:

       通过单击“开始测量”按钮,设备测量的数据可以实时的显示在上位机程序前面板上,主函数代码如下:

int main (int argc, char *argv[])

{

    if (InitCVIRTE (0, argv, 0) == 0)

          return -1;  /* out of memory */

    if ((panelHandle = LoadPanel (0, "剂量率.uir", PANEL)) < 0)

          return -1;


    OpenComConfig (3, "com3", 9600, 0, 8, 2, 512, 512);

    SetCTSMode (3,LWRS_HWHANDSHAKE_OFF) ;

    FlushInQ (3);

    FlushOutQ (3);

    menubar = GetPanelMenuBar (panelHandle);

    Radio_ConvertFromTree ( panelHandle,  PANEL_RADIOGROUP);

    GetCurrentDateTime (&currDateTime);

    SetCtrlAttribute (panelHandle, PANEL_STRIPCHART, ATTR_XAXIS_OFFSET, currDateTime);

   

    /*创建一个默认定时间隔为系统异步定时器精度的异步定时器,初始状态为停止*/

    TimerID1 = NewAsyncTimer(resolution1, -1, 0, AsyncTimerEventFunction1, 0);

    TimerID2 = NewAsyncTimer(resolution2, -1, 0, AsyncTimerEventFunction2, 0);

   

    GetAsyncTimerResolution(&resolution1); 

    TimerID1 = NewAsyncTimer(resolution1, -1, 0, AsyncTimerEventFunction1, 0);

    SetAsyncTimerAttribute (TimerID1, ASYNC_ATTR_INTERVAL, 1.0);

    SetAsyncTimerAttribute (TimerID1, ASYNC_ATTR_ENABLED, 1);

   

    GetAsyncTimerResolution(&resolution2); 

    TimerID2 = NewAsyncTimer(resolution2, -1, 0, AsyncTimerEventFunction2, 0);

    SetAsyncTimerAttribute (TimerID2, ASYNC_ATTR_INTERVAL, 1.0);

    SetAsyncTimerAttribute (TimerID2, ASYNC_ATTR_ENABLED, 0);

    SetCtrlAttribute (panelHandle, PANEL_Start, ATTR_DIMMED, 0);

    SetCtrlAttribute (panelHandle, PANEL_Stop, ATTR_DIMMED, 0);

   

    DisplayPanel (panelHandle);

    RunUserInterface ();

    CloseCom(3);

    DiscardPanel (panelHandle);

    return 0;

}

ComCallback函数部分代码如下:

void CVICALLBACK ComCallback (int portNo, int eventMask,void *callbackData)

{

    double val=0;

    char buffer[26]={0};

   

    int i=0;

    int len=0;

    double buf1=0,buf2=0,buf3=0,buf4=0,buf=0;

    int h=0,m=0,s=0;

    int numLines;

 

    char hour[6],minute[6],second[6],message[40]="";

    char data[25]="";

    char filename[260];

    len=GetInQLen (3);

   

    if(len)

    {

       ComRd (3, buffer, 26);   

      

       SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, 1);

      

       buf1=buffer[3]&0x0f;

       buf2=buffer[4]&0x0f;

       buf3=buffer[5]&0x0f;

       buf4=buffer[6]&0x0f;

       buf=buf1+buf2+buf3+buf4;

       val=buf;

       val=val/100;

                

       datatemp[num-1]=val;

       PlotStripChartPoint (panelHandle,PANEL_STRIPCHART,val);

……

}

      开始测量的代码如下:

int CVICALLBACK Start (int panel, int control, int event,

   void *callbackData, int eventData1, int eventData2)

{

switch (event)

{

case EVENT_COMMIT:

    InstallComCallback (3, LWRS_RXCHAR, 0, '\0', ComCallback, 0);

    SetMenuBarAttribute (menubar, MENUBAR_MENU1_ITEM1, ATTR_DIMMED, 1);

    SetMenuBarAttribute (menubar, MENUBAR_MENU1_ITEM2, ATTR_DIMMED, 0);

    testing();

break;

}

return 0;

}

        四、结论

        本文利用LabWindows/CVI开发平台编写了上位机PC程序,利用LabWindows/CVI实现串口通信,充分发挥了虚拟仪器开发的便捷功能,完成了实时性控制工作。相比于使用组态王等软件,其功能更为丰富,并且可以充分利用多线程技术,合理分配多个实时性任务,保证多个并发任务顺利执行。


基于LabWindows/CVI的RS232串口通信的实现的评论 (共 条)

分享到微博请遵守国家法律