nilabwindowscvi串口编程rs232教程
- 格式:doc
- 大小:33.50 KB
- 文档页数:6
N I L a b w i n d o w s C V I 串口编程R S232教程-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN4.4.1 RS-232C 接口介绍在介绍具体的RS-232 函数库之前,本节先简要介绍RS-232C 接口。
美国电子工业协会(EIA)公布的 RS-232C 是用的最多的一种串行通信标准,它是从CCITT 远程通信标准中导出的,用于数据终端设备(DTE)和数据通信设备(DEC)之间的接口。
该标准包括按位串行传输的电气和机械方面的规定。
一、接口信号RS-232C 的机械指标规定:RS-232C 接口通向外部的连接器(插针插座)是一种“D”型25 针插头。
由于25 芯中有许多是不常用的,IBM-PC 对其进行了简化,取了其中的常用的9 芯,构成了9 芯RS-232C 串行接口,使其成为一种事实上的串行接口标准配置。
RS-232C 的“D”型9 针插头引脚定义如图4-13 所示。
RS-232C 标准接口中的主要信号是“发送数据”和“接收数据”,它们用来在两个系统或设备之间传送串行信息。
对于异步通信,传输的串行位数据信息的单位是字符。
二、数据传送格式和电气特性图4-14 示出了RS-232C 以位串行方式传输数据的格式,这是微机系统中最通用的格式。
7 位ASCII 码数据的连续传送由最低有效数字位开始,而以奇偶校验位结束。
应当指出,RS-232C 标准接口并不限于ASCII 数据,事实上还可有5 到8 个数据位,后加一奇偶校验位,并有1 或2 位停止位。
在电性能方面,这一标准使用负逻辑。
逻辑1 电平是在-15V 到-5V 范围内,逻辑0电平则在+5V 到+15V 范围内。
它要求RS-232C 接收器必须能识别低至+3V 的信号作为逻辑0,而识别高至-3V 的信号作为逻辑1,这意味着有2V 的噪声容限。
RS-232C 进行数据传输的最高速率为20KB/S,通信距离最长为15m。
LabWindowsCVI入门之第三章:计算机外设开发LabWindows/CVI入门之第三章:计算机外设开发通过上一章节的学习,大家已经掌握了在CVI 下开发GUI应用程序的基本步骤和基本方法。
CVI的重要应用是工业接口通信、复杂的数据采集和仪器控制系统的开发,所以对于学习CVI 来说仅仅掌握GUI程序的开发还远远不够。
实际生产生活中,有些设备要求能够满足军用或工业领域恶劣环境或极端天气下对于可靠性的要求,有些设备要求能够满足快速大容量数据的持续传输的要求,有些设备要求能够满足防尘防水防暴防震防撬的要求,有些设备要求满足低成本的要求,纷繁的要求导致了不同的接口标准以及接口协议的诞生。
仅仅掌握了CVI下GUI的编程只能说是对CVI入门,却没有充分的体会到CVI的精华。
在纷繁的接口与个性化的需求下,开发简捷高效、稳定易用、用户体验良好的程序才是我们学习CVI的终极目标。
3.1 计算机组件编程在本节中,我们将会接触到在CVI下进行文件操作、音频播放、OpenGL操作、SQL数据库查询、剪贴板操作、动态数据交换、ActiveX 控件操作、调用.Net操作等相关内容。
在介绍相关内容时,我们只介绍原理与CVI对应的函数功能,具体使用方法需要大家查询CVI的帮助文档。
3.1.1 在CVI中进行文件操作在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上存放起来,以后需要时再从磁盘中输入到计算机内存。
这样就需要对文件进行读写操作,LabWindows/CVI 中对文件读写操作的常用函数如下:(1)OpenFile 打开一个文件用以读或者写,函数返回文件句柄;(2)CloseFile 关闭指定的文件;(3)ReadFile 从文件中读取指定字节数的内容到字符串缓冲区;(4)WriteFile 将字符串缓冲区中指定字节数的内容写到文件中;(5)ArrayToFile 将数组内容保存到文件中;该函数运行之后,将在工程文件夹下新建一test.txt的文本文件,文件内容如图3-1所示。
基于LabWindows/CVI的串口调试助手(含参考代码)一、界面除此之外,还需要修改某些控件的属性,修改步骤如下:编辑COMSELECT控件的Label/Value属性,向控件添加项目的Label分别为串口1、串口2,相应的Value值为1、2,数据类型为整数。
1编辑BTLSELECT控件的Label/Value属性,向控件添加项目的Label分别为1200、2400、4800、9600、19200,相应的Value值为1200、2400、4800、9600、19200,数据类型为整数。
编辑JYSELECT控件的Label/Value属性,向控件添加项目的Label分别为奇校验、偶校验、无校验,相应的Value值为1、2、0,数据类型为整数。
编辑LONGSELECT控件的Label/Value属性,向控件添加项目的Label分别为7、8、9,相应的Value值为7、8、9,数据类型为整数。
编辑STOPSELECT控件的Label/Value属性,向控件添加项目的Label分别为1、2,相应的Value值为1、2,数据类型为整数。
编辑两个文本框的属性:Text Box Options…-Enter Key Causes Newline以允许在文本框中输入多行文本。
之后保存文件com.uir。
二、代码#include <rs232.h>#include <ansi_c.h>#include <cvirte.h>#include <userint.h>#include "com.h"static int panelHandle;int comSelect=0;int status;char info[513];int CVIFUNC DimObject(int stat){SetCtrlAttribute(panelHandle,PANEL_COMSELECT,ATTR_DIMMED,stat); SetCtrlAttribute(panelHandle,PANEL_BTLSELECT,ATTR_DIMMED,stat); SetCtrlAttribute(panelHandle,PANEL_JYSELECT,ATTR_DIMMED,stat); SetCtrlAttribute(panelHandle,PANEL_LONGSELECT,ATTR_DIMMED,stat); SetCtrlAttribute(panelHandle,PANEL_STOPSELECT,ATTR_DIMMED,stat); SetCtrlAttribute(panelHandle,PANEL_OPEN_COM,ATTR_DIMMED,stat); SetCtrlAttribute(panelHandle,PANEL_CLOSE_COM,ATTR_DIMMED,!stat); SetCtrlAttribute(panelHandle,PANEL_SEND,ATTR_DIMMED,!stat); SetCtrlAttribute(panelHandle,PANEL_CLEARSEND,ATTR_DIMMED,!stat); SetCtrlAttribute(panelHandle,PANEL_RECIEVE,ATTR_DIMMED,!stat); SetCtrlAttribute(panelHandle,PANEL_CLEARRECIVE,ATTR_DIMMED,!stat); return 0;}int main (int argc, char *argv[])/*——————主函数——————*/{2}if (InitCVIRTE (0, argv, 0) == 0)return -1; /* out of memory */if ((panelHandle = LoadPanel (0, "com.uir", PANEL)) < 0)return -1;DisplayPanel (panelHandle);RunUserInterface ();DiscardPanel (panelHandle);return 0;int CVICALLBACK Quit (int panel, int control, int event,/*——————退出、关闭串口——————*/void *callbackData, int eventData1, int eventData2){switch (event){case EVENT_COMMIT:if(comSelect){CloseCom(comSelect);comSelect=0;DimObject(0);}QuitUserInterface (0);break;}return 0;}int CVICALLBACK ClearTextBox (int panel, int control, int event,*/{void *callbackData, int eventData1, int eventData2)/*——————清空文本框——————switch (event){case EVENT_COMMIT:if(control==PANEL_CLEARRECIVE)ResetTextBox(PANEL,PANEL_RECIVETEXT,"\0");//清空接收框elseResetTextBox(PANEL,PANEL_SENDTEXT,"\0");//清空发送框3break;}return 0;}int CVICALLBACK Recieve (int panel, int control, int event,/*——————接收信息功能函数——————*/void *callbackData, int eventData1, int eventData2) {switch (event){case EVENT_COMMIT:if(!comSelect) return -1;SetComTime(comSelect,2.0);//设置通信超时时限。
第一章 : LabWindows/CVI1.1 LabWindows/CVI1.1.1 LabWindows/CVI概述LabWindows/CVI是美国NI(National Instruments)公司开发的面向计算机测控领域的虚拟仪器软件开发平台,可以在多种操作系统(WindowsXP/Vista/7、Mac OS和Unix)下运行。
LabWindows/CVI 是为C 语言程序员提供的集成开发环境(IDE),在此开发环境中可以利用C语言及其提供的库函数来实现程序的设计、编辑、编译、链接、调试。
使用LabWindows/CVI 可以完成以下但不限于以下工作:·交互式的程序开发;·具有功能强大的函数库,用来创建数据采集和仪器控制的应用程序;·充分利用完备的软件工具进行数据采集、分析和显示;·利用向导开发IVI 仪器驱动程序和创建ActiveX 服务器;·为其它程序开发C 目标模块、动态连接库(DLL)、C 语言库。
图 1‐1 LabWindows/CVI界面LabWindows/CVI 的功能强大在于它提供了丰富的函数库。
利用这些库函数除可实现常规的程序设计外,还可实现更加复杂的数据采集和仪器控制系统的开发。
数据采集。
IVI库、GPIB/GPIB 488.2库、NI-DAQmx库、传统的NI-DAQ库、RS-232库、VISA库、VXI库以及NI-CAN库。
数据分析。
格式化IO库、分析库以及可选的高级分析库。
GUI库。
使用LabWindows/CVI 的用户界面编辑器可以创建并编辑图形用户界面(GUI),而使用LabWindows/CVI 的用户界面库函数可以在程序中创建并控制GUI。
此外,LabWindows/CVI为GUI 面板的设计,准备了许多专业控件,如:曲线图控件、带状图控件、表头、旋钮和指示灯等,以适应测控系统软件开发的需求,利用这些控件可以设计出专业的测控程序界面。
串口可以说是我们最容易见到,也最容易接触到的一种总线,台式机上一般都有二个,而现在很多下位机、仪器等很多都还是使用串口通信的。
论坛上很多朋友都经常会使用到串口,并遇到一些问题,这里有必要做一个详细的说明,以方便广大会员朋友方便使用。
首先补充一个比较重要的问题,就是在LabVIEW中使用串口的话一定要先安装VISA这个驱动,然后生成的EXE运行时也需要在目标机上安装VISA Runtime Engine,可以在打包时一起打包。
1.串口扩展的问题:先说一下串口的扩展问题,一般的台式机或工控机上都至少有二个串口,一般都是够用的,但是现在市场上已经很难找到带串口的笔记本了,而有时候在外出调试时需要在笔记本中使用到串口的,这时一般是使用USB-RS232的转接线,价格从十几到一百多都有,很多朋友反应在使用价格低的转接线时会出现乱七八糟的问题,而贵一点的线就很少听说有其它问题的,所以大家在使用便宜的USB-RS232转接线时要特别注意线的质量,遇到一些奇怪的问题时先考虑换一根好一点的线。
PCI-RS232扩展卡也同理,便宜的卡也容易出问题,尽量买好一点的,以免因小失大。
PCI-RS232一般至少能扩展2个串口,有些BT一点的可以扩展到8-16个,一堆线和接头。
转接线和扩展卡一般是要装驱动的。
2.串口功能的确认:在使用串口之前,最好先确认一下串口是否正常,特别是使用转换接或扩展卡的。
检查的方法很简单,就是将串口的2、3脚短接起来,3脚是发送数据,2脚接收数据,就是这个串口自发自收。
电脑上的串口软件一般是用串口调试助手,很出名的,也好用。
如下图所示:图1串口调试助手打开软件,选择已经短接好的串口号,点击“手动发送”,如果串口是好的,2、3脚又短接起来了,马上就可以在上面的接收框里看到接收的数据就是发送的数据。
稍微要注意一下的是有些电脑的COM1和COM2的位置是反过来的,所以要确定好串口调试助手左上角的串口上择的是已经短接的那一个,如果COM1没接收到,可以再先COM2再发一次看一下。
LabWindows/cvi之RS-232串口通信编程源代码/* LabWindows/CVI User Interface Resource (UIR) Include File *//* Copyright (c) National Instruments 2006. All Rights Reserved. *//* *//* W ARNING: Do not add to, delete from, or otherwise modify the contents *//* of this include file. *//**************************************************************************/#include <userint.h>#ifdef __cplusplusextern "C" {#endif/* Panels and Controls: */#define PANEL 1#define PANEL_OKBUTTON_2 2 /* callback function: receivefile */#define PANEL_OKBUTTON 3 /* callback function: receivefilename */#define PANEL_STRING_2 4#define PANEL_QUITBUTTON 5 /* callback function: QuitCallback */#define PANEL_STRING 6#define PANEL_DECORATION_2 7#define PANEL_COMMANDBUTTON 8 /* callback function: filesel */#define PANEL_DECORATION 9#define PANEL_TEXTMSG 10#define PANEL_TEXTMSG_2 11/* Menu Bars, Menus, and Menu Items: *//* (no menu bars in the resource file) *//* Callback Prototypes: */int CVICALLBACK filesel(int panel, int control, int event, void *callbackData, int eventData1, int eventData2);int CVICALLBACK QuitCallback(int panel, int control, int event, void*callbackData, int eventData1, int eventData2);int CVICALLBACK receivefile(int panel, int control, int event, void *cal lbackData, int eventData1, int eventData2);int CVICALLBACK receivefilename(int panel, int control, int event, void*callbackData, int eventData1, int eventData2);#ifdef __cplusplus}#endif#include <ansi_c.h>#include <utility.h>#include <rs232.h>#include <cvirte.h>#include <userint.h>#include "232.h"static int byteswritten;static char filename[MAX_FILENAME_LEN];static char pathname[MAX_PATHNAME_LEN];static int panelHandle;int main (int argc, char *argv[]){if (InitCVIRTE (0, argv, 0) == 0)return -1; /* out of memory */if ((panelHandle = LoadPanel (0, "232.uir", PANEL)) < 0)return -1;//打开并配置串口Com1OpenComConfig (1, "", 57600, 1, 8, 1, 32767, 32767);//设置通信超时时间SetComTime (1, 5.0);//禁止串口软件握手SetXMode (1, 0);//禁止硬件握手SetCTSMode (1, LWRS_HW HANDSHAKE_OFF); DisplayPanel (panelHandle);RunUserInterface ();DiscardPanel (panelHandle);return 0;}int CVICALLBACK sendfilename (int panel, int control, int event, void *callbackData, int eventData1, int eventData2){int comstatus;int outputqueuelen;switch (event){case EVENT_COMMIT:strcat (filename, "\r");//向Com1写入文件名字符串byteswritten = ComWrt (1, filename, strlen(filename));break;}return 0;}int CVICALLBACK QuitCallback (int panel, int control, int event, void *callbackData, int eventData1, int eventData2){switch (event){case EVENT_COMMIT://关闭串口Com1CloseCom (1);QuitUserInterface (0);break;}return 0;}int CVICALLBACK filesel (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){int selstatus;switch (event){case EVENT_COMMIT:filename[0] = '\0';selstatus = FileSelectPopup ("", "*.*", "*.*", "打开文件", VAL_LOAD_BUTTON, 0, 0, 1, 1, pathname);if (selstatus >= 0){SetCtrlVal (panelHandle, PANEL_STRING, pathname);//获得文件名SplitPath (pathname, NULL, NULL, filename);}break;}return 0;}int CVICALLBACK sendfile (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){int outputqueuelen;switch (event){case EVENT_COMMIT://设置串口Com1调制解调器参数XModemConfig (1, 10.0, 10, 5.0, 1024);//设置从串口Com1发送文件数据XModemSend (1, pathname);//获得串口Com1输出队列的字符串数目outputqueuelen = GetOutQLen (1);if (outputqueuelen == 0){MessagePopup ("文件传输", "文件传输完毕!");}break;}return 0;}接收程序#include "toolbox.h"#include <ansi_c.h>#include <rs232.h>#include <cvirte.h>#include <userint.h>#include "232.h"static int bytesread;static char filename[MAX_PATHNAME_LEN];static char pathname[MAX_PATHNAME_LEN];static int panelHandle;int main (int argc, char *argv[]){if (InitCVIRTE (0, argv, 0) == 0)return -1; /* out of memory */if ((panelHandle = LoadPanel (0, "232.uir", PANEL)) < 0) return -1;//打开并配置串口Com2OpenComConfig (2, "", 57600, 1, 8, 1, 32767, 32767);//设置通信超时时间SetComTime (2, 5.0);//禁止串口软件握手SetXMode (2, 0);//禁止硬件握手SetCTSMode (2, LWRS_HW HANDSHAKE_OFF);DisplayPanel (panelHandle);RunUserInterface ();DiscardPanel (panelHandle);return 0;}int CVICALLBACK receivefilename (int panel, int control, int event, void *callbackData, int eventData1, int eventData2){switch (event){case EVENT_COMMIT:filename[0] = '\0';SetCtrlVal (panelHandle, PANEL_STRING, "");//读取字符串直到回车符出现bytesread = ComRdTerm (2, filename, 260, 13);//当出现回车符后,在其后加上结束符filename[bytesread]= '\0';SetCtrlVal (panelHandle, PANEL_STRING, filename);break;}return 0;}int CVICALLBACK QuitCallback (int panel, int control, int event, void *callbackData, int eventData1, int eventData2){switch (event){case EVENT_COMMIT://关闭串口Com2CloseCom (2);QuitUserInterface (0);break;}return 0;}int CVICALLBACK filesel (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){int selstatus;switch (event){case EVENT_COMMIT:selstatus = DirSelectPopup ("", "保存文件", 1, 1, pathname); if (selstatus){strcat (pathname, "\\");strcat (pathname, filename);SetCtrlVal (panelHandle, PANEL_STRING_2, pathname);}break;}return 0;}int CVICALLBACK receivefile (int panel, int control, int event, void *callbackData, int eventData1, int eventData2){int result;int filesize;int inputqueuelen;FILE *stream;switch (event){case EVENT_COMMIT:GetCtrlVal (panelHandle, PANEL_STRING_2, pathname);//判断文件是否存在result = FileExists (pathname, &filesize);if (!result){stream = fopen (pathname, "wb+");fclose (stream);}//设置串口Com2调制解调器参数XModemConfig (2, 10.0, 10, 5.0, 1024);//设置从串口Com2接收文件数据XModemReceive (2, pathname);//获得串口Com2输入队列的字符串数目inputqueuelen = GetInQLen (2);if (inputqueuelen == 0){MessagePopup ("文件保存", "文件保存完毕!"); }break;}return 0;}。
Labwindows/CVI串口程序最近对自己这篇文章再次查看了一下,感觉写得比较粗略,因此在此对其进行一些修改和详细讲解下。
希望对大家有用!串口的相关函数: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 parityValid Values:0 = no parity,1 = odd parity,2 = even parity,3 = mark parity,4 = space parityint dataBits 数据位数Default Value: 7 data bitsValid Values: 5,6,7 or 8 data bitsint stopBits 停止位Default Value: 1 stop bit Valid Values: 1 or 2 stop bits int inputQueueSize 串口输入的数据量,一般选择的4,096int outputQueueSize 串口输出的数据量,一般选择的4,096函数的返回值来判定串口的状态。
在介绍具体的RS-232 函数库之前,本节先简要介绍RS-232C 接口。
美国电子工业协会(EIA)公布的 RS-232C 是用的最多的一种串行通信标准,它是从CCITT 远程通信标准中导出的,用于数据终端设备(DTE)和数据通信设备(DEC)之间的接口。
该标准包括按位串行传输的电气和机械方面的规定。
一、接口信号RS-232C 的机械指标规定:RS-232C 接口通向外部的连接器(插针插座)是一种“D”型25 针插头。
由于25 芯中有许多是不常用的,IBM-PC 对其进行了简化,取了其中的常用的9 芯,构成了9 芯RS-232C 串行接口,使其成为一种事实上的串行接口标准配置。
RS-232C 的“D”型9 针插头引脚定义如图4-13 所示。
RS-232C 标准接口中的主要信号是“发送数据”和“接收数据”,它们用来在两个系统或设备之间传送串行信息。
对于异步通信,传输的串行位数据信息的单位是字符。
二、数据传送格式和电气特性图 4-14 示出了RS-232C 以位串行方式传输数据的格式,这是微机系统中最通用的格式。
7 位ASCII 码数据的连续传送由最低有效数字位开始,而以奇偶校验位结束。
应当指出,RS-232C 标准接口并不限于ASCII 数据,事实上还可有5 到8 个数据位,后加一奇偶校验位,并有1 或2 位停止位。
在电性能方面,这一标准使用负逻辑。
逻辑1 电平是在-15V 到-5V 范围内,逻辑0电平则在+5V 到+15V 范围内。
它要求RS-232C 接收器必须能识别低至+3V 的信号作为逻辑0,而识别高至-3V 的信号作为逻辑1,这意味着有2V 的噪声容限。
RS-232C 进行数据传输的最高速率为20KB/S,通信距离最长为15m。
RS-232 函数库概述LabWindows/CVI 提供的RS-232 函数库主要包括以下几类函数:串行口打开/关闭(Open/Close)函数,串行口输入/输出(Input/Output)函数,串行口控制(Control)函数,串行口状态查询(Status)函数,串行口事件处理(Callbacks)函数。
列表如下:RS-232 编程举例利用LabWindows/CVI 的RS-232 函数库进行串行口应用编程时,主要包括以下几个步骤:首先要打开一个串行口并对其进行配置,然后用户就可以利用该串行口收发数据,程序结束之前则应当关闭该串行口。
本节结合一个实例介绍RS-232 函数库的使用方法。
读者能在目录\samples\rs232\下找到该例子。
该实例利用计算机的串行口1 实现了“自发自收”和“串行口事件检测”的功能。
所谓“自发自收”指的是从计算机串行口发送出去的信息又被本计算机收到,而“串行口事件检测”的意思是当计算机的串行口检测到特定的字符时就弹出提示对话框。
该例子虽然简单,但它非常有助于用户掌握串行口编程的基本思路和RS-232 相关函数的使用方法。
以下将分步骤介绍该该例程的实现方法。
步骤一:编写界面,生成程序框架首先,用户应按照图4-15 所示编写软面板。
为方便用户编写软面板,表4-28 列出了软面板上各控件的基本属性设置。
图 4-15 软面板示意图表 4-28 软面板主要控件基本属性设置软面板编完以后,用户就可以利用LabWindows/CVI 自动生成程序框架,并进入步骤二。
步骤二:打开串行口1 并进行配置此部分代码添加在主函数中,如下所示:int main (int argc, char *argv[]){if (InitCVIRTE (0, argv, 0) == 0) /* Initialize CVI libraries */return -1; /* out of memory */if ((gPanelHandle = LoadPanel (0, "", PANEL)) < 0)return -1;if ((gHelpPanelHandle = LoadPanel (0, "", HELP_PANEL)) < 0)return -1;OpenComConfig (1, "", 9600, 0, 8, 1, 512, 512); /* 打开串行口1 并进行配置*/SetCTSMode (1, LWRS_HWHANDSHAKE_OFF); /* 禁止硬件握手 */FlushInQ (1); /* 清空串行口1 的输入队列 */FlushOutQ (1); /* 清空串行口1 的输出队列 *//* 弹出窗口提示用户输入待检测的事件字符 */PromptPopup ("Event Charcter", "Enter the Event Character", gEventChar, 1);/* 为串行口1 设置一个回调函数,使得串行口1 收到待检测字符时就调用回调函数 Event_Char_Detect_Func 给出提示 */InstallComCallback (1, LWRS_RXFLAG, 0, (int)gEventChar[0] ,Event_Char_Detect_Func, 0);DisplayPanel (gPanelHandle); /* 显示主界面 */RunUserInterface (); /* 运行用户界面 */CloseCom (1); /* 在退出程序之前关闭串行口1*/DiscardPanel (gPanelHandle);DiscardPanel (gHelpPanelHandle);return 0;}上述代码中用到了函数OpenComConfig,该函数的功能是:打开一个串行口并对该串行口进行配置。
函数原型:int OpenComConfig (int COM_Port, char Device_Name[ ],long Baud_Rate, int Parity, int Data_Bits,int Stop_Bits, int Input_Queue_Size,int Output_Queue_Size);参数说明:COM_Port:整型变量,用于指定要打开的端口号,有效范围为1-1000。
Device_Name[ ]:字符型数组,用ASCII 字符串表示的串行口名,该参数一般默认为空。
Baud_Rate:长整型变量,串行口的波特率,标准的波特率有:110、300、600、1200、2400、4800、9600、19200 等。
应当指出,利用串行口进行通讯时,通讯双方的波特率必须一致。
此外,包括通讯双方的奇偶校验模式、数据位位数、停止位位数等也必须一致。
Parity:整型变量,用于指定奇偶校验模式。
0 表示无奇偶校验,1 表示奇校验,2则表示偶校验,另有两种不太常用的校验模式,此处不作介绍。
Data_Bits:整型变量,用于指定每帧信息中数据位的位数,可选的位数为5、6、7和8。
Stop_Bits:整型变量,用于指定每帧信息中停止位的位数,可选的位数为1 和2。
Input_Queue_Size:整型变量,用于指定串行口输入队列的大小。
Output_Queue_Size:整型变量,用于指定串行口输出队列的大小。
因此,OpenComConfig (1, "", 9600, 0, 8, 1, 512, 512)的作用是打开串行口1,并对串行口1 配置如下:波特率为9600,无奇偶校验,8 位数据位,一位停止位,输入/输出队列的大小均为512 字节。
函数 FlushInQ (1)和FlushOutQ (1)的作用分别为清空串行口1 的输入队列和输出队列。
上述代码中还用到了一个关键性的函数InstallComCallback,该函数的功能是:为指定的串行口设置一个回调函数,当有相应的事件(比如串行口收到了特定的字符)发生时,就调用指定的回调函数。
函数原型:int InstallComCallback (int COM_Port, int Event_Mask,int Notify_Count, int Event_Character,ComCallbackPtr Callback_Function,void *Callback_Data);参数说明:Event_Mask:整型变量,用于指定一个事件,当该事件发生时,就调用指定的回调函数,如果要禁止回调函数的调用,该参数填0。
不同的常量名代表不同的事件,以下将几个常用的常量名解释如下:常量名串行口事件LWRS_RXCHAR 串行口收到任意的字符LWRS_RXFLAG 串行口收到特定的字符LWRS_TXEMPTY 串行口的发送序列为空LWRS_RECEIVE 串行口输入队列中的字符数已达到指定的数量Notify_Count:整型变量,使LWRS_RECEIVE 事件能够发生的输入队列内的最小字节数。
Event_Character:整型变量,用于指定触发LWRS_RXFLAG 事件(串行口收到特定的字符)的字符值。
Callback_Function:用于指定被调用的回调函数名,而且回调函数必须按以下格式定义:void CVICALLBACK CallbackFunctionName (int portNo,int eventMask, void *callbackData)Callback_Data:该参数可以是指向某个数据的指针,也可以是一个整形变量,它将被传给上述的回调函数Callback_Function。
一般该参数填为0 即可。
由以上的叙述可知,InstallComCallback (1, LWRS_RXFLAG, 0, (int)gEventChar[0] , Event_Char_Detect_Func, 0)函数的作用是:当串行口1 收到特定的字符时就调用函数Event_Char_Detect_Func ,提示用户串行口1 收到了某个特定的字符。
函数Event_Char_Detect_Func 的代码如下:void CVICALLBACK Event_Char_Detect_Func (int portNo,int eventMask,void*callbackData){char outMessage[256];Fmt (outMessage, "%s<%s%s%s","The Character \"",gEventChar,"\" was detected");MessagePopup ("Install CommCallback", outMessage);/* 弹出一个消息框给出提示信息 */return;}步骤三:利用串行口收发数据在本例中,串行口发送数据是通过该命令按钮“Send Data”对应的回调函数SendData()实现的,代码如下:int CVICALLBACK SendData (int panel, int control, int event, void *callbackData, int eventData1, int eventData2){char info[20];switch (event){case EVENT_COMMIT:/* 清空“Message Received”字符串*/SetCtrlVal (gPanelHandle, PANEL_OUTOUT_STRING, "\0");/* 将“Message to Send”字符串控件内的信息的存到数组info 中 */GetCtrlVal (gPanelHandle, PANEL_INPUT_STRING, info);FlushInQ (1); /*清空串行口1 的输入队列*//* 将“Message to Send”字符串控件内的信息的从串行口1 输出 */ComWrt (1, info, strlen(info));break;}return 0;}上述代码中,用到了函数ComWrt(1, info, strlen(info)),其作用在于将数组info[ ]中的信息送到串行口的输出队列。