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

虚拟仪器(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实现串口通信,充分发挥了虚拟仪器开发的便捷功能,完成了实时性控制工作。相比于使用组态王等软件,其功能更为丰富,并且可以充分利用多线程技术,合理分配多个实时性任务,保证多个并发任务顺利执行。