一、串口VI介绍
LabVIEW的串口通讯VI位于Instrument I/O Platte的Serial中,包括:
VI名称 VISA Configure Serial Port VISA Write VISA Read VISA Serial Break VISA Bytes at Serial Port VISA Close VISA Set I/O Buffer Size VISA Flush I/O Buffer VI功能 初始化VISA resource name指定的串口通讯参数 将输出缓冲区中的数据发送到VISA resource name指定的串口 将VISA resource name指定的串口接收缓冲区中的数据读取指定字节数的数据到计算机内存中 向VISA resource name指定的串口发送一个暂停信号 查询VISA resource name指定的串口接收缓冲区中的数据字节数 结束与VISA resource name指定的串口资源之间的会话 设置VISA resource name指定的串口的输入输出缓冲区大小 清空VISA resource name指定的串口的输入输出缓冲区 二、使用说明
在LabVIEW环境中使用串口与在其它开发环境中开发过程类似,基本的流程框图如下。
图1、串口操作数据流图
首先需要调用VISA Configure Serial Port完成串口参数的设置,包括串口资源分配、波特率、数据位、停止位、校验位和流控等等。
图2、初始化串口
如果初始化没有问题,就可以使用这个串口进行数据收发。发送数据使用VISA Write,接收数据使用VISA Read。在接收数据之前需要使用VISA Bytes at Serial Port查询当前串口接收缓冲区中的数据字节数,如果VISA Read要读取的字节数大于缓冲区中的数据字节数,VISA Read操作将一直等待,直至Timeout或者缓冲区中的数据字节数达到要求的字节数。当然也可以分批读取接收缓冲区或者只从中读取一定字节的数据。
图3、从串口发送数据 图4、从串口接收数据
在某些特殊情况下,需要设置串口接收/发送缓冲区的大小,此时可以使用VISA Set I/O Buffer Size;而使用VISA Flush I/O Buffer则可以清空接收与发送缓冲区。在串口使用结束后,使用VISA Close结束与VISA resource name指定的串口之间的会话。
图5、设置缓冲区大小 图6、 清空缓冲区 图7、结束会话/线程
具体的例子可以参考:examples\\instr\\smplserl.llb。 第二部分使用MSCOMM控件
在LabVIEW中使用MSCOMM控件,与在VC、VB中使用一样。同样可以使用中断方式进行接收。
图8、使用控件的串口收发程序
图9、程序数据流图
首先通过LabVIEW的工具菜单“Tools >> Advanced >> Import ActiveX Controls”将Microsoft的串口控件-“Microsoft Communications Control,version 6.0”添加到LabVIEW环境中,存放在缺省路径即可,这样在User Controls Palette里面可以找到这个控件。
图10、添加ActiveX控件菜单
图11、选择添加用户控件
图12、用户控件
将串口控件 放置在Front Panel上,在框图程序中用控件属性对其进行编程,实现所需要的功能。
注意:一个串口资源要有一个MSCOMM控件与之相对应。
第三部分 注意事项
一、串口通讯的波特率设置要精确,比如要求9600的波特率,则晶振应选择11.0593MHz或其倍数。
二、由于通常情况下LabVIEW串口VI接收或发送的都是字符串(Normal),所以如果需要发送或接收十六进制数值(Hex),请在发送或接收之前进行必要的转换。
2.1、数值型数据的处理方法:
1. 如果这些数据是静态的,也就说在程序设计阶段要传输的数据就已经确定了,在这种情况下,首先
设置VISA Write的write buffer的显示属性为Hex Display,然后直接输入要发送的16进制字符串就可以了。串口设备的控制命令通常是由一个或多个16进制字符组成的,当我们需要对其进行控制时经常会采用这种方法发送控制命令。
2. 数据是动态的;即要传输的数值型数据是动态产生和变化的,在发送之前首先要将其转换成对应的
16进制字符串,才能赋给VISA Write发送。将这些数据构成一个数组,用Byte Array To String进行转换,转换的结果就是对应数组数值的字符串,可以提交VISA Write发送。或者使用Type Cast也可以实现同样的功能。
图13、串口数据转换界面
图14、 串口数据转换数据流图
图15、操作界面
图16、单片机C程序
2.2、字符串型数据的处理方法:
我们在处理过程当中,传输的数据可能具有一定格式或协议,比如一个完整的数据帧包括起始段、数据段、校验段等等,而每一段往往又有几个部分组成,这几个部分的类型和长度可能又不尽相同,可能是数值型的,可能是字符型的,也可能是布尔型的,单字节或者是多字节。此时我们往往都采用统一的字符形式来处理这些数据,因此有时候我们说,字符是LabVIEW里最方便的数据类型。
经过打包的字符数据要经过串口发送需要进行必要的转换,否则传输将出错。比如我们打包过后需要发送的的字符串为:34 12 56 78 94(空格为了区分),如果直接将其赋给VISA Write发送,串口上的数据将是:33 34 31 32 35 36 37 38 39 34。正确的转换程序如下。
图17、字符型数据处理
数据接收:
从计算机串口接收到的数据是16进制的ASCII码,要转换成对应的数值型数据,可以使用String To Byte Array或者Type Cast。
三、LabVIEW串口VI不能使用中断方式传输。
串行通讯
终端与计算机之间或者计算机与计算机之间进行交换信息时,除了采用并行通讯方式之外,还经常采用串行通讯方式。并行通讯是指数据的各位同时进行传送,其有点是传送数据速度快,缺点是有多少位数据就需要多少根传输线,这在数据位数较多,传送距离较远时就不宜采用。串行通讯是指数据一位一位地按顺序传送,其突出优点是只需一根传输线,特别适应于远距离传输,缺点是传送速度较慢。
在微机测量,控制系统中,目前串行数据的传输大多采用异步通讯的方式。
1. 同步通讯和异步通讯
串行通讯分为同步传送和异步传送两种方式。
o ? 同步传送方式要求通信双方以相同的速率进行,而且要准确地协调。它通过共享一个单个时钟或定时脉
冲源以保证发送方和接受方准确同步。其特点是允许连续发送一组字符序列(而非单个字符),每个字符数据位数相同,没有起始位和停止位,效率高。
o ? 异步传送方式不要求通信双方同步,发送方和接受方可以有各自的时钟源。为了能够实现通信,双方必
须都遵循异步通信协议。在异步通信中,通信双方必须规定两件事:一是字符格式,即规定字符各部分所占的位数,是否采用奇偶校验,以及校验的方式;二是采用的波特率,以及时钟率与波特率之间的比例关系。由此可见,异步通信方式的传输效率比同步通信方式低,但它对通信双方的同步要求大大降低,因而成本也比同步通信方式低。
2. DTE和DCE
在串行通讯中,用于发送和接收数据的设备称为数据终端设备(Data Terminal Equipment 简写为DTE)。DTE既可以是一台计算机,也可以是一台只接收数据的打印机。用于连接DTE与数据通信网络的设备称为数据通信设备(Data Communications Equipment 简写为DCE),或称为数据电路终接设备。DCE既可以是一个调制解调器,也可以是简单的线路驱动器。
3. 波特率
在串行通讯中还有一个重要的指标——波特率(又称调制速率)。波特率定义为每秒钟传送二进制数码的位数,以位/秒(bit/s)为单位,亦称“波特”。在异步通讯中,波特率为每秒传送的字符数和每个字符位数的乘积,例如每秒传送的速率为120字符/秒,而每个字符又包含10位(1位起始位,7位数据位,1位奇偶校验位,1位停止位),则波特率为:
120字符/秒×10位/字符=1200位/秒=1200波特
注意:波特率与时钟频率不是一回事,时钟频率比波特率要高得多,通常在高16倍或64倍。由于异步通讯双方各用自己的时钟源采用较高频率的时钟,在一位数据内就有16位或64个时钟,捕捉正确的信号就可以得到保证,若时钟频率就是波特率,则频率稍有偏差就会发生接收错误。
LabVIEW中的串行通讯选板
安装完labVIEW8.2后,还需要安装VISA的驱动程序才能使用串口,驱动程序的下载地址为:
ftp://ftp.ni.com/support/visa/drivers/win32/4.0/visa400full.exe
LabVIEW中有关串口的函数选板如图,它位于函数→仪器I/O→串口
下面举一个例子来说明串口是如何进行通讯的
例:双机通讯
1. 功能描述
双机通信是在两台计算机之间进行串口通讯。一台计算机作为服务器,通过RS-232串口向外发送数据;另一台计算机作为客户机,接收由服务器发送来的数据。
2. 串口引脚连接
两台计算机的串口之间通过一根RS-232电缆线连接起来,串口电缆线采用三线制,它只使用发送数据(TxD),接收数据(RxD)和信号地(SG)三根信号线。
3. 服务器程序设计
其程序设计如下:
㈠新建一个VI,在前面板上放置4个输入控件:“端口号”,“波特率”,“数据比特”和“停止位”。另外,放置一个字符串输入控件,在其内部输入向外发送的字符串数据。添加程序文本标签“串口服务器”。
㈡在程序框图中放置一个层叠式顺序结构,创建两个分支。在第0分支中,放置一个“Serial Port Init.vi”函数,并添加一个顺序局部变量;在第1分支中,放置一个“Serial Port Write.vi”函数,它们位于labVIEW8.2→vi.lib→Instr→serial。连线如图:
前面板如图:
4.客户机程序设计与服务器程序类似,其中使用了“Bytes At Serial Port.vi”函数和“Serial Port Read.vi”它们都在前文所提到的路径中,客户机程序框图如图:
前面板如图:
串口的内容就为大家简单的介绍这么多,有什么问题可上我们的论坛发帖,我们会尽力为大家解答
labview称做\"G\"语言,只是说明了它具备了通用编程语言的编程能力,但是任何编程语言都有器独特的特点,否则经过几十年的风风雨雨,并没有出现一种编程语言一统天下的格局,每种编程语言都有其特别适合的领域,从这点来说,数据采集和仪器通讯可以说是它最擅长的领域.毫无疑问,计算机的串口通讯是相对比较简单的通讯方式,labview也不例外地对它提供了支持.
LABVIEW的串口控制,可以通过多种方法:
1.最基本的IN OUT 控制,LABVIEW提供了In port 和Out Port两个基本输入输出VI,通过它就可以直接读写寄存器,我本人 做的许多并口控制设备就是利用了这两个节点,在计算机的DOS时代,通过IN OUT指令进行串口通讯是唯一的选择,现在正在做单片机的朋友都知道,单片机的串口通讯都是通过操作寄存器实现的,对于计算机的COM1,它的端口地址是0X3F8,完全可以通过它来完成串口通讯.
2.利用API的WriteFile 函数实现串口通讯,这是VC进行串口通讯的方法.
3.利用VB提供的MSCOMM控件(这是目前用的最多的,它支持查询和中断两种模式,即可以发送文本型数据(ASCII),由可以发送二进制(BIN,实际是BYTE ARRAY)
4.利用LABVIEW特有的VISA通讯
直接控制寄存器的方法在计算机串口通讯基本看不到了.只有在单片机中还采用这种方式. 通过C51串口通讯,简单地介绍一下这种方法: /* 发送数据函数 */ void SendData(uchar *buf) { uchar i; uchar len;
len=strlen(buf); /* 取得字符串长度*/ for(i=0;i {
SBUF=buf[i]; /* SBUF是串口输出REG */ while(!TI);/* 等待发送完成 */ TI=0; /* 复位中断标志 */ } }
方法2直接调用API非常复杂,在LV不会采用,就不介绍了. 方法3是目前用的最多,介绍一下. MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。 来源: http://dev.yesky.com/347/2636847.shtml 2.1 事件驱动方式 事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。 2.2 查询方式 查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。 MSComm 控件有很多重要的属性,但首先必须熟悉几个属性。 CommPort 设置并返回通讯端口号。 Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 PortOpen Input Output
设置并返回通讯端口的状态。也可以打开和关闭端口。 从接收缓冲区返回和删除字符。 向传输缓冲区写一个字符串。 下面分别描述:
CommPort属性:设置并返回通讯端口号。
语法 object.CommPort[value ] (value 一整型值,说明端口号。)
说明 在设计时,value 可以设置成从 1 到 16 的任何数(缺省值为 1)。但是如果用 PortOpen 属性打开一个并不存在的端口时,MSComm 控件会产生错误 68(设备无效)。
注意:必须在打开端口之前设置 CommPort 属性。
RThreshold 属性:在 MSComm 控件设置 CommEvent 属性为 comEvReceive 并产生 OnComm 之前,设置并返回的要接收的字符数。 语法:object.Rthreshold [ = value ](value 整型表达式,说明在产生 OnComm 事件之前要接收的字符数。 ) 说明:当接收字符后,若 Rthreshold 属性设置为 0(缺省值)则不产生 OnComm 事件。例如,设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。 CTSHolding 属性:确定是否可通过查询 Clear To Send (CTS) 线的状态发送数据。Clear To Send 是调制解调器发送到相联计算机的信号,指示传输可以进行。该属性在设计时无效,在运行时为只读。 语法: object.CTSHolding(Boolean) Mscomm 控件的 CTSHolding 属性设置值: True Clear To Send 线为高电平。 False Clear To Send 线为低电平。 说明:如果 Clear To Send 线为低电平 (CTSHolding = False) 并且超时时,MSComm 控件设置 CommEvent 属性为 comEventCTSTO (Clear To Send Timeout) 并产生 OnComm 事件。 Clear To Send 线用于 RTS/CTS (Request To Send/Clear To Send) 硬件握手。如果需要确定 Clear To Send 线的状态,CTSHolding 属性给出一种手工查询的方法。 详细信息 有关握手协议,请参阅 Handshaking 属性。 SThreshold 属性: MSComm 控件设置 CommEvent 属性为 comEvSend 并产生 OnComm 事件之前,设置并返回传输缓冲区中允许的最小字符数。 语法 object.SThreshold [ = value ] value 整形表达式,代表在 OnComm 事件产生之前在传输缓冲区中的最小字符数。 说明:若设置 Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。若设置 Sthreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生 OnComm 事件。如果在传输缓冲区中的字符数小于 value,CommEvent 属性设置为 comEvSend,并产生 OnComm 事件。comEvSend 事件仅当字符数与 Sthreshold 交叉时被激活一次。例如,如果 Sthreshold 等于 5,仅当在输出队列中字符数从 5 降到 4 时,comEvSend 才发生。如果在输出队列中从没有比 Sthreshold 多的字符,comEvSend 事件将绝不会发生。 Handshake 常数 常数 comNone 值 0 描述 无握手。 comXonXoff comRTS 1 2 XOn/Xoff 握手。 Request-to-send/clear-to-send 握手。 和 clear-to-send 握手皆可。 comRTSXOnXOff 3 Request-to-send OnComm 常数 常数 值 描述 发送事件。 接收事件。 comEvSend 1 comEvReceive 2 comEvCTS 3 clear-to-send 线变化。 线变化。 comEvDSR 4 data-set ready comEvCD 5 carrier detect 线变化。 振铃检测。 文件结束。 comEvRing 6 comEvEOF 7 Error 常数 常数 值 描述 接收到中断信号 Clear-to-send 超时 Data-set ready 超时 帧错误 端口超速 Carrier detect 超时 接收缓冲区溢出 Parity 错误 传输缓冲区满 comEventBreak 1001 comEventCTSTO 1002 comEventDSRTO 1003 comEventFrame 1004 comEventOverrun 1006 comEventCDTO 1007 comEventRxOver 1008 comEventRxParity 1009 comEventTxFull 1010 设备控制块 (DCB) 时的意外错误 comEventDCB 1011 检索端口 InputMode 常数 常数 值 描述 comInputModeText 0 (缺省) 通过 Input 属性以文本方式取回数据。 comInputModeBinary 1 通过 Input 属性以二进制方式检取回数据。 CDHolding 属性:通过查询 Carrier Detect (CD) 线的状态确定当前是否有传输。Carrier Detect 是从调制解调器发送到相联计算机的一个信号,指示调制解调器正在联机。该属性在设计时无效,在运行时为只读。 语法 object.CDHolding 设置值:CDHolding 属性的设置值为: 设置 描述 线为高电平 True Carrier Detect False Carrier Detect 线为低电平 说明:注意当 Carrier Detect 线为高电平 (CDHolding = True) 且超时时,MSComm 控件设置CommEvent 属性为 comEventCDTO(Carrier Detect 超时错误),并产生 OnComm 事件。 注意 在主机应用程序中捕获一个丢失的传输是特别重要的,例如一个公告板,因为呼叫者可以随时挂起(放弃传输)。 Carrier Detect 也被称为 Receive Line Signal Detect (RLSD)。 数据类型:Boolean DSRHolding 属性:确定 Data Set Ready (DSR) 线的状态。Data Set Ready 信号由调制解调器发送到相连计算机,指示作好操作准备。该属性在设计时无效,在运行时为只读。 语法:object.DSRHolding object 所在处表示对象表达式,其值是“应用于”列表中的对象。 DSRHolding 属性返回以下值: 值 描述 Data Set True Ready 线高 CommEvent 属性为 comEventDSRTO(数据准备超时)并产生 OnComm 事件。 说明 当 Data Set Ready 线为高电平 (DSRHolding = True) 且超时时,MSComm 控件设置 当为 Data Terminal Equipment (DTE) 机器写 Data Set Ready/Data Terminal Ready 握Data Set False Ready 线低 数据类型:Boolean 手例程时该属性是十分有用的。
Settings 属性: 设置并返回波特率、奇偶校验、数据位、停止位参数。
语法: object.Settings[ = value]
说明:当端口打开时,如果 value 非法,则 MSComm 控件产生错误 380(非法属性值)。
Value 由四个设置值组成,有如下的格式:
\"BBBB,P,D,S\"
BBBB 为波特率,P 为奇偶校验,D 为数据位数,S 为停止位数。value 的缺省值是:
\"9600,N,8,1\"
InputLen 属性:设置并返回 Input 属性从接收缓冲区读取的字符数。
语法 object.InputLen [ = value]
InputLen 属性语法包括下列部分:
value 整型表达式,说明 Input 属性从接收缓冲区中读取的字符数。
说明:InputLen 属性的缺省值是 0。设置 InputLen 为 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。
若接收缓冲区中 InputLen 字符无效,Input 属性返回一个零长度字符串 (\"\")。在使用 Input 前,用户可以选择检查 InBufferCount 属性来确定缓冲区中是否已有需要数目的字符。该属性在从输出格式为定长数据的机器读取数据时非常有用。
EOFEnable 属性:确定在输入过程中 MSComm 控件是否寻找文件结尾 (EOF) 字符。如果找到 EOF 字符,将停止输入并激活 OnComm 事件,此时 CommEvent 属性设置为 comEvEOF,
语法:object.EOFEnable [ = value ]
EOFEnable 属性语法包括下列部分:
value 布尔表达式,确定当找到 EOF 字符时,OnComm 事件是否被激活,如“设置值”中所描述。
value 的设置值:
True 当 EOF 字符找到时 OnComm 事件被激活。
False (缺省)当 EOF 字符找到时 OnComm 事件不被激活。
说明:当 EOFEnable 属性设置为 False,OnComm 控件将不在输入流中寻找 EOF 字符。
3.错误消息(MS Comm 控件)
下表列出 MSComm 控件可以捕获的错误:
值 380 383 394 8000 8001 8002 8003 8004 8005 8006 8007 8008 8009 8010 8011 8012 8013 8014 描述 无效属性值 comInvalidPropertyValue 属性为只读 comSetNotSupported 属性为只读 comGetNotSupported 端口打开时操作不合法 comPortOpen 超时值必须大于 0 无效端口号 comPortInvalid 属性只在运行时有效 属性在运行时为只读 端口已经打开 comPortAlreadyOpen 设备标识符无效或不支持该标识符 不支持设备的波特率 指定的字节大小无效 缺省参数错误 硬件不可用(被其它设备锁定) 函数不能分配队列 设备没有打开 comNoOpen 设备已经打开 不能使用 comm 通知 8015 不能设置 comm 状态 comSetCommStateFailed 8016 不能设置 comm 事件屏蔽 8018 仅当端口打开时操作才有效 comPortNotOpen 8019 8020 设备忙 读 comm 设备错误 comReadError comDCBError 8021 为该端口检索设备控制块时的内部错误
以上这部分转载于网上.
labview可以直接调用ACTIVEX控件,所以可以直接使用,新版本的LV可以注册回调函数(REG CALLBACK),所以这个控件的所有功能都是可用的,下面示意一下调用的方法.
重点介绍一下VISA串口通讯的方法:
基本流程是:打开(配置)--->循环(读写)--->关闭(释放)
一共有八个VI节点
1.VISA Configure Serial Port :
设定波特率,数据位,停止位,奇偶校验位,流控制,超时处理,结束符使能,结束符.
特别需要注意的是超时(TIMEOUT) 和结束符号两个参数.TIMEOUT默认的10秒,结束符号默认是使能状态,默认的结束符是0X0A(\\n),另外,回车0x0D (\\r)也经常做为做为结束符号.
如果采用的是二进制通讯,可能会遇到结束符的问题.因为二进制中0A是10,0D是13,这两个是作为数字出现的,如果不禁止结束符号,会导致读提前结束,产生错误的结果,这再和设备通讯时可能会碰到.
至于波特率,数据位等,对照要通讯的设备的要求设定就可以了.
2.Visa Write: 这个节点负责把缓冲区的数据发送出去,并返回实际发送的数据.
MSCOMM串口通讯时是可以选择文本和二进制方式的,VISA有选择项吗?没有,完全取决于你的字符串,这是一个需要注意的问题.
正常显示方式时,字符串是"1234"在内存中存储的是ASCII,看下图.
"1"=31,"2"=32 "3"=33,"4"=34.
发送的字符串"1234"实际发送的是16进制的31,32,33,34.用过单片机的都知道,实际所有的串口通讯从本质上说,都是二进制的,只不过接收方面如何判定数据的问题.
比如发送的是33(HEX),接收方面可以解释成数字1,(字符串型),或者是数字33. 用过C的人知道,字符串实际和U8数组是等价的.
所以VISA是不管是否是字符串还是数值,都是采用二进制发送的,关键是我们在于我们的字符串是如何构成的.
Visa Read等其它的几个都比较简单,就不介绍了.
因篇幅问题不能全部显示,请点此查看更多更全内容