LabwindowsCVI串口程序
LabWindows_CVI开发环境下实现串口通讯的方法

软件应用
表 4 串口设置函数功能
函数名 ComB reak Com SetE scap e F lu sh InQ F lu shO u tQ SetCT SM ode SetCom T im e SetXM ode
函数功能 设置通讯终止时间 设置各种通信握手信号
清空接收队列 清空发送队列 设置硬件握手 设置通讯超时时间 允许或禁止串口通讯的软件握手
B u tton
函数为 R eceiveD a te
Q u it
QU IT
Comm and 退出应用程序, 消息
B u tton
响应函数为 qu it
413 程序部分代码 在主函数中打开串口:
O p enCom Config (1, " " , 9600, 0, 8, 1, 512, 512) ;
打 开 并 设 置 串 口, 此 调 用 语 句 打 开 串 口 1, 波 特 率 为
L abW indow s CV I 有许多标准函数库, 其中的 R S232 函数库提供了各种方式的串口通讯控制函数和 I O 函数, 一共可分为打开 关闭函数、I O 读写函数、 调制解调器控制函数、 串口设置函数、 寄存器状态函
数和回调函数 6 类。 其中部分较常用的函数如下: 这些函数返回的各种状态信息可参阅相应函数面
收稿日期: 2003 11 15
62
软件开发的角度来看, L abW indow s CV I 具有以下一 些特点:
(1) 基于标准 C 语言, 简单易学。 (2) 可视化、 交互式的开发工具。 具有人机交互 界 面编辑器, 运用可视化交互技术实现 “所见即所 得”, 使人机界面的实现直观简单。对每一个函数都提 供了一个函数面板, 用户可以通过函数面板交互地输 入函数的每一个参数及属性值。 这种交互式编程技术 大大提高了工程设计的效率和可靠性。 (3) 具有程序自动生成的能力, 可减少软件开发 过程中代码编写的工作量。 设计好的人机交互界面 (虚拟仪器面板) 存储在后缀名为 1u ir 的文件中。L ab2 W indow s CV I 自动生成原码头文件 1h, 自动声明界 面对象常量及相关的回调函数, 编程人员不必钻研这 些技术。 (4) 具有齐全的软件工具包及功能强大的函数库, 通过简单调用库函数就能驱动相应的总线的各种仪器 和硬件板卡。这些工具包和函数库具有更高的效率, 他 使得程序的编写更简洁、 直观。 (5) 完善的兼容性。借助于L abW indow s CV I, 有 经验的 C C+ + 语言开发人员可以采用熟悉的 C 语言 环境, 如V C, BC 等开发自己的虚拟仪器系统。另外, 还可将仪器库函数及子程序编译成 32 位DLL , 以用 于任何 32 位 C C+ + 环境中以及 V isua l B a sic 或 L ab2
LabWindows CVI教程

第一章 : 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 面板的设计,准备了许多专业控件,如:曲线图控件、带状图控件、表头、旋钮和指示灯等,以适应测控系统软件开发的需求,利用这些控件可以设计出专业的测控程序界面。
LabWindows

LabWindows/CVl实现远程虚拟测控技术Lab Windows/CVI为美国NI公司的虚拟测控软件,具有超强的实时数据采集和处理能力,以及丰富的图形界面GUI设计功能.它主要的直接支持硬件设备为NI公司的AD/DA板卡和远程的Field Paints等产品,价格昂贵.这些硬件设备对工业控制中常用的设备,如PLC、变频器及自我开发的微控制器、采集器等设备缺乏有效的兼容,无法满足国内工业控制仪表和测试的现实需要,故其优越的性能还没有在这一领域得到充分发挥.本文通过实践,研讨了基于LabWindows/CVl实现一般设备网络远程虚拟测控方法.从系统性和实用性的角度,较好解决了CVI应用存在问题,丰富了虚拟测控的形式和内容.1远程控制的框架结构本文采用的是客户端/服务器的网络模式,如图1所示.客户端放置于远端,主要提出控制申请、递交控制参数和观测分析实验结果等.服务器(本地机)放置于最接近现场或对象的地方,实现对现场或对象的数据采集与控制、返回现场的实时录像等.服务器的另一个重要任务是,认证来自客户端的控制申请,根据具体控制项目的不同,服务端可采用灵活的控制方式,有的在计算机PCI或ISA槽插上数据采集卡对对象实行UDC 测控C3),有的则通过串_口通讯(如RS232 , RS485 )操纵专门的仪器设备或微控制器对对象实行监督型测控。
2关键技术的研究和开发2.1 LabWindowsJCVI与Matlab的软接口技术为了方便实现各种复杂的算法,服务器端的系统Matlab设于后台,完成控制系统建模和算法计算工作.其他程序如通讯、数据库、数据采集、部分数据处理等用CVI编写,通过对Matlab的调用,获取算法计算结果等数据.CVI对1VIatlab的调用关键是数据和命令的交换,即软接口技术.本文采用引擎程序实现软接口。
Lab W indowslCV I环境的引擎程序是ANSIC编写的,它通过在程序中调用引擎函数完成与Matlab之间的数据交换和命令传递.其环境建立即创建引擎函数的使用条件,包括建Libeng. lib,Libmx.lib,Libmat.lib3个静态链接库文件.引擎程序中会使用到的engine函数和mx函数都包括在这些静态库中了.此外,是对engine.h头文件的包含.因为engine.h中不但含有对引擎函数及相关数据类型的定义,还对matrix.h进行了包含.如果缺少了它们,将无法使用Matlab引擎.引擎程序的主体部分如下:#include“engine.h”//包含引擎头文件//其他编译预处理int main(){//变量定义及初始化Engine *ep; //定义引擎指针epmxArray * A=NULL, * B=NULL;//定义结构体变量1double * Breal,* Bimag;double a[10]={0,1,2,3,4,5,6,7,8,9};char buffer[360];//程序主体,所涉及的函数已经在静态库和engine. h中声明了if(j (ep=engOpen(NULL)))//引擎调用函数engOpen{fprintf(buffer,“\n Can’t start Matlab engine!\n");return EXIT_FAILURE;//不成功返回值EXIT_FAILURE}A=mxCreateDoubleMatrix(1, 10, mxREAL);//构造1X10的双精度矩阵mxSetName(A,"A");//矩阵命名,这个名字是在Matlab环境中使用的memcpy((void *) mxGetPr(A), (void *)a, sizeof(a));//为矩阵的实部赋值,a已定义engPutArray(ep, A) ;//将已定义的变量输人Matlab环境engEvalString(ep,"Y=3. *sir(A);")//使用Matlab的计算函数求解Y= 3 sin(x)B=engGetArray(ep, "Y");//从Matlab中获得矩阵值,并赋给结构体指针变量BengCloSe(ep);//关闭引擎,对Matlab的调用就此结束//下面是对输出矩阵变量的处理Breal=mxGetPr (B);//获得矩阵实部Bimag=mxGetPi (B);//获得矩阵虚部if(Bimag)//计算结果应是实数矩阵,如果虚部不为空,则显示出错Sprintf(buffer, "Get array wrong!”);//释放内存mxDestroyArray(A);mxDestroyArray(B);return 0;}2.2 数据通讯技术2.2.1 在LabWindows/CVI环境下使用TCP/IP协议LabWindows/CVI的TCP库函数提供丁与平台无关的,面向连接的字节流网络通信协议编程接口.与用户接口库目标文件回调函数处理用户接口事件的方法类似,TCP回调函数可以处理3种TCP消息,即TCP_CONNECT, TCP_ DISCONNECT和TCP_DATA READY.TCP库函数可以分为服务器函数、客户函数和支持函数.2.2.2 在LabWindows/CVI环境下使用串口通讯许多外设都可以采用RS232/RS485的控制模式控制.变频器的控制就是一个典型例子.图2为CVI实现变频器控制的结构示意图.LG公司的iG5系列的变频器有其自带的专用驱动程序DriveView,可对变频器各项参数进行调节和控制.但其操作界面刻板,使用形式单一,通过发挥CVI 的优势,可以大大扩展其控制的内容和形式.但由于iG5不是NI公司的产品,必须编制另外的通迅控制程序.LabWindows/CVI实现对变频器通迅控制的技术思路是,远程服务器使用CVI的RS232串口命令,利用变频器说明书提供的LG专用通讯协议实现对变频器实施控制.客户端通过设定控制参数和Ethernet上的网络摄像机,监控其运行.通讯协议可选择用MODB-US-RTU通讯协议和LG公司专用协议.考虑控制的可靠性和可控内容的多样性,选择LG公司的专用通讯方式.协议主要部分为读请求、写请求和应答回复等.(1)请求读取.总字节为12 B,如表1所示.(2)请求写入.总字节为12十n*4=44 B(最大值),表1,2中,标记“”是字符,以ENQ为头码,EOT为尾码发送请求。
基于Lab Windows/CVI的PC与 DSP的串行通信.

基于Lab Windows/CVI的PC与 DSP的串行通信摘要:实现了一种全集成可变带宽中频宽带低通滤波器,讨论分析了跨导放大器-电容(OTA—C)连续时间型滤波器的结构、设计和具体实现,使用外部可编程电路对所设计滤波器带宽进行控制,并利用ADS软件进行电路设计和仿真验证。
仿真结果表明,该滤波器带宽的可调范围为1~26 MHz,阻带抑制率大于35 dB,带内波纹小于0.5 dB,采用1.8 V电源,TSMC 0.18μm CMOS工艺库仿真,功耗小于21 mW,频响曲线接近理想状态。
关键词:Butte0 引言随着数字信号处理理论及微电子技术的高速发展,数字信号处理器(DSP)已广泛应用于各个控制领域。
而在控制系统中,通常会利用PC机与DSP之间的通信来对系统各个状态/参数进行监控。
这种方法既利用了DSP功耗低、价格相对便宜、功能强大、抗干扰能力强、适宜于分布现场等优点,同时又结合了PC机的软硬件资源丰富、管理功能强大、人机界面友好、操控平台稳定可靠、数据通信方便快捷等系统功能优势。
为此,本文拟通过使用比较广泛的RS-232-C接口标准来研究PC与TMS320F2812 DSP之间的异步串行通信。
1 硬件设计这里采用最简单的三线连接方法,即PC机与DSP的发送、接收端彼此交叉连接,地线对应连接的方法。
另外,由于DSP的串行通信接口SCI的两个外部引脚SCITXD和SCIRXD的信号为TTL电平,与RS-232-C标准逻辑电平不一致,因此,要进行信号电平转换后才能连接到PC机的串口接头DB9,图1所示是其硬件连接电路,其中电平转换选用MAX3232芯片和若干电容来实现,使用时只用其中的一对收/发单元。
2 软件设计2.1 通信协议本设计将通信的帧格式设置为1个起始位,8个数据位,无奇偶校验位,1个停止位。
图2所示为其数据帧格式,其传输波特率为9600 bps,采用全双工通信方法。
PC机发送数据包的格式是:包头+功能码+参数码+数据内容+校验和,本设计分别设置它们占1、2、2、4、4个字节。
NI-LabwindowsCVI串口编程-RS232--教程

4.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。
4.4.2 RS-232 函数库概述LabWindows/CVI 6.0 提供的RS-232 函数库主要包括以下几类函数:串行口打开/关闭(Open/Close)函数,串行口输入/输出(Input/Output)函数,串行口控制(Control)函数,串行口状态查询(Status)函数,串行口事件处理(Callbacks)函数。
LabWindows-CVI安装教程

1.启动setup.exe.
2.打开LabWindows-CVI 9-0 Evaluation\Crack下keygen.exe。
点击Generate,随后copy生成
的serial number到上图对应的位置。
最后点击Create license file,将生成的文件保存到你知道的位置。
(此处默认文件名为1.lic,后续有用)
3.接下来选择文件的安装位置。
(安装路径上不要有中文),点击Next。
4.再次选择安装路径。
点Next。
5.之后会出现软件安装接受协议。
一直点击Next即可。
(因为我电脑里面已经安装,不会
出现后续的画面,所以没有图片展示)最终安装开始。
6.安装完成后,点击Finish,出现安装完成的祝贺信息。
7.点击Next,在出现的方面中选择重新启动Restart。
完成安装过程。
8.重启电脑后,选择National Instruments下的NI License Manager。
9.在选项中点击安装许可证文件。
然后找到1.lic文件。
软件激活完成。
LabWindowscvi之RS-232串口通信编程源代码

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-CVIPC机与DSP间串口通讯设计

基于LabWindows/CVI的PC机与DSP间串口通讯设计摘要:本文以tms320f2808为例,简要的介绍了dsp c2000串口通讯接口的设计,并基于labwindows/cvi编程实现pc机与tms320f2808的串口通讯。
关键词:labwindows/cvi;tms320f2808;串口通讯中图分类号:tp393.09labwindows/cvi是一个完全的ansi c开发环境,用于仪器控制、自动检测、数据处理的应用软件。
使用灵活的c语言开发平台与数据采集、分析和显示有机的结合起来,为熟悉c语言的开发人员建立自动化检测系统、数据采集系统和过程化控制等提供了一个理想的软件开发环境。
采用ti公司生产的tms320f2808作为处理芯片,它是一款专为控制应用系统而设计的32位定点运算dsp。
它具有强大的外设功能,无需额外增加其它芯片便可轻松实现ad采集、多功能gpio口、sci、spi、can、iic以及其它通信接口。
利用labwindows/cvi灵活的c语言以及dsp强大的处理能力,可以灵活的实现pc机与dsp之间串行数据的交互功能。
1 pc机与dsp间的串口通讯设计1.1 dsp串口设计dsp与pc机进行数据交换,两者之间必须采用一个电平转换芯片,本文选用max公司生产的max3232进行电平转换。
pc机与dsp串口通讯框图如图1所示,电平转换电路如图2所示。
tms320f2808的内部具有两个相同的sci模块,scia和scib。
每个sci模块都有独立的接收器和发送器,他们有各自独立的使能位和中断位,可以进行半双工和全双工的工作模式。
每个sci模块同时拥有独立的两个收发引脚scirxd和scitxd,在不使用sci模式时,这两个引脚可以作为通用i/o口使用。
tms320f2808可编程实现64000种不同的波特率,还可通过硬件逻辑来实现自动波特率的功能。
1.2 通讯协议设计dsp与pc机之间采用固定的9.6k波特率,无奇偶校验,8位数据位,1位停止位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 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
函数的返回值来判定串口的状态。
返回值为0,表示串口打开成功,为负值串口打开失败!具体使用见下面的程序:
/////////////////////////////串口开启程序///////////////////////////
void ConnectEquipment(int serial_num, long baudrate,int parity ,int databits,int stopbits)
{
int RS232Error;
DisableBreakOnLibraryErrors();
RS232Error =OpenComConfig (serial_num, "", baudrate, parity,databits,stopbits, inputq,outputq);
EnableBreakOnLibraryErrors();
if(RS232Error ==0)
MessagePopup("RS232信息:","端口打开成功");
if (RS232Error==-1)
MessagePopup("RS232信息:","未知的系统错误");
if (RS232Error==-2)
MessagePopup("RS232信息:","端口号无效");
if (RS232Error==-3)
MessagePopup("RS232信息:","端口无法打开");
if (RS232Error==-4)
MessagePopup("RS232信息:","未知的I/O错误");
if (RS232Error==-6)
MessagePopup("RS232信息:","没有发现串行端口");
if (RS232Error==-7)
MessagePopup("RS232信息:","无法打开端口");
if (RS232Error==-1)
MessagePopup("RS232信息:","未知的系统错误");
}
(1)串口打开后,在使用中一般不会出现连接等硬件错误;
(2)可以通过通讯协议用软件方法判定串口通讯是否正确;
(3)一定要每次发送都判定串口状态的话,请使用GetComConnectionState (int portNumber)函数!
(4)GetCommStat()返回指定串口的信息,为两个字节的十六进制数,每个位代表不同的状态信息。
但是不建议使用它:使用它虽然能够知道串口是否发生错误,但通过返回值却并不能具体知道究竟是什么错误(这可能是NI自己的一个bug 吧)。
(5)打开串口后发送数据前要先清除串口中以前的数据,避免送出的数据错误,用的函数为:FlushOutQ(Serial_num);
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
int ComWrt (int portNumber, char buffer[], int count);
写一串数据到开启的串口的数据队列中去。
数据位字符的形式传输。
int portNumber 开启的串口号;
char buffer[]存储待传输的数据;
int count 数据的长度
返回值:返回传输数据个数count表示传输成功,否则传输失败或没有传输完。
int ComWrtByte (int portNumber, int byte);
功能:写一个int byte数据到int portNumber串口中去。
虽然写的数据为int型,但是被传输出去的仅仅是int型数据的低8位,高8位字符自动屏蔽,为0。