Labview串口通信开发实例Word文档格式.docx
《Labview串口通信开发实例Word文档格式.docx》由会员分享,可在线阅读,更多相关《Labview串口通信开发实例Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
![Labview串口通信开发实例Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/1/cb5d1cfa-f36a-4947-a47f-386c8ddbeeba/cb5d1cfa-f36a-4947-a47f-386c8ddbeeba1.gif)
这意味着串口通信在数据线上的采样率为4800Hz。
通常电话线的波特率为14400,28800和36600。
波特率可以远远大于这些值,但是波特率和距离成反比。
高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
b,数据位:
这是衡量通信中实际数据位的参数。
当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。
如何设置取决于你想传送的信息。
比如,标准的ASCII码是0~127(7位)。
扩展的ASCII码是0~255(8位)。
如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。
每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。
由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
c,停止位:
用于表示单个包的最后一位。
典型的值为1,1.5和2位。
由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。
因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
d,奇偶校验位:
在串口通信中一种简单的检错方式。
有四种检错方式:
偶、奇、高和低。
当然没有校验位也是可以的。
对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。
例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。
如果是奇校验,校验位位1,这样就有3个逻辑高位。
高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。
这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。
可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。
用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。
RS-232只限于PC串口和设备间点对点的通信。
RS-232串口通信最远距离是50英尺。
DB-9针连接头
-------------
\12(RXD)3(TXD)45(GND)/
\6789/
-------
从计算机连出的线的截面。
RS-232针脚的功能:
数据:
TXD(pin3):
串口数据输出
RXD(pin2):
串口数据输入
握手:
RTS(pin7):
发送数据请求
CTS(pin8):
清除发送
DSR(pin6):
数据发送就绪
DCD(pin1):
数据载波检测
DTR(pin4):
数据终端就绪
地线:
GND(pin5):
地线
其他
RI(pin9):
铃声指示
RS-422(EIARS-422-AStandard)是Apple的Macintosh计算机的串口连接标准。
RS-422使用差分信号,RS-232使用非平衡参考地的信号。
差分传输使用两根线发送和接收信号,对比RS-232,它能更好的抗噪声和有更远的传输距离。
在工业环境中更好的抗噪性和更远的传输距离是一个很大的优点。
RS-485(EIA-485标准)是RS-422的改进,因为它增加了设备的个数,从10个增加到32个,同时定义了在最大设备个数情况下的电气特性,以保证足够的信号电压。
有了多个设备的能力,你可以使用一个单个RS-422口建立设备网络。
出色抗噪和多设备能力,在工业应用中建立连向PC机的分布式设备网络、其他数据收集控制器、HMI或者其他操作时,串行连接会选择RS-485。
RS-485是RS-422的超集,因此所有的RS-422设备可以被RS-485控制。
RS-485可以用超过4000英尺的线进行串行通行。
DB-9引脚连接
\12345/
RS-485和RS-422的引脚的功能
TXD+(pin8),TXD-(pin9),RXD+(pin4),RXD-(pin5)
RTS+(pin3),RTS-(pin7),CTS+(pin2),CTS-(pin6)
GND(pin1)
RS-232通行方式允许简单连接三线:
Tx、Rx和地线。
但是对于数据传输,双方必须对数据定时采用使用相同的波特率。
尽管这种方法对于大多数应用已经足够,但是对于接收方过载的情况这种使用受到限制。
这时需要串口的握手功能。
在这一部分,我们讨论三种最常用的RS-232握手形式:
软件握手、硬件握手和Xmodem。
a,软件握手:
我们讨论的第一种握手是软件握手。
通常用在实际数据是控制字符的情况,类似于GPIB使用命令字符串的方式。
必须的线仍然是三根:
Tx,Rx和地线,因为控制字符在传输线上和普通字符没有区别,函数SetXModem允许用户使能或者禁止用户使用两个控制字符XON和OXFF。
这些字符在通信中由接收方发送,使发送方暂停。
例如:
假设发送方以高波特率发送数据。
在传输中,接收方发现由于CPU忙于其他工作,输入buffer已经满了。
为了暂时停止传输,接收方发送XOFF,典型的值是十进制19,即十六进制13,直到输入buffer空了。
一旦接收方准备好接收,它发送XON,典型的值是十进制17,即十六进制11,继续通信。
输入buffer半满时,LabWindows发送XOFF。
此外,如果XOFF传输被打断,LabWindows会在buffer达到75%和90%时发送XOFF。
显然,发送方必须遵循此守则以保证传输继续。
b,硬件握手:
第二种是使用硬件线握手。
和Tx和Rx线一样,RTS/CTS和DTR/DSR一起工作,一个作为输出,另一个作为输入。
第一组线是RTS(RequesttoSend)和CTS(CleartoSend)。
当接收方准备好接收数据,它置高RTS线表示它准备好了,如果发送方也就绪,它置高CTS,表示它即将发送数据。
另一组线是DTR(DataTerminalReady)和DSR(DataSetReady)。
这些现主要用于Modem通信。
使得串口和Modem通信他们的状态。
当Modem已经准备好接收来自PC的数据,它置高DTR线,表示和电话线的连接已经建立。
读取DSR线置高,PC机开始发送数据。
一个简单的规则是DTR/DSR用于表示系统通信就绪,而RTS/CTS用于单个数据包的传输。
在LabWindows,函数SetCTSMode使能或者禁止使用硬件握手。
如果CTS模式使能,LabWindows使用如下规则:
当PC发送数据:
RS-232库必须检测CTS线高后才能发送数据。
当PC接收数据:
如果端口打开,且输入队列有空接收数据,库函数置高RTS和DTR。
如果输入队列90%满,库函数置低RTS,但使DTR维持高电平。
如果端口队列近乎空了,哭喊数置高RTS,但使DRT维持高电平。
如果端口关闭,库函数置低RTS和DTR。
c,XModem握手:
最后讨论的握手叫做XModem文件传输协议。
这个协议在Modem通信中非常通用。
尽管它通常使用在Modem通信中,XModem协议能够直接在其他遵循这个协议的设备通信中使用。
在LabWindows中,实际的XModem应用对用户隐藏了。
只要PC和其他设备使用XModem协议,在文件传输中就使用LabWindows的XModem函数。
函数是XModemConfig,XModemSend和XModemReceive。
XModem使用介于如下参数的协议:
start_of_data、end_of_data、neg_ack、wait_delay、start_delay、max_tries、packet_size。
这些参数需要通信双方认定,标准的XModem有一个标准的定义:
然而,可以通过XModemConfig函数修改,以满足具体需要。
这些参数的使用方法由接收方发送的字符neg_ack确定。
这通知发送方其准备接收数据。
它开始尝试发送,有一个超时参数start_delay;
当超时的尝试超过max_ties次数,或者收到接收方发送的start_of_data,发送方停止尝试。
如果从发送方收到start_of_data,接收方将读取后继信息数据包。
包中含有包的数目、包数目的补码作为错误校验、packet_size字节大小的实际数据包,和进一步错误检查的求和校验值。
在读取数据后,接收方会调用wait_delay,然后想发送方发送响应。
如果发送方没有收到响应,它会重新发送数据包,直到收到响应或者超过重发次数的最大值max_tries。
如果一直没有收到响应,发送方通知用户传输数据失败。
由于数据必须以pack_size个字节按包发送,当最后一个数据包发送时,如果数据不够放满一个数据包,后面会填充ASCII码NULL(0)字节。
这导致接收的数据比原数据多。
在XModem情况下一定不要使用XON/XOFF,因为XModem发送方发出包的数目很可能增加到XON/OFF控制字符的值,从而导致通信故障。
RS-232,RS-422和RS-485串口通讯接口的快速比较
问题:
RS-232,RS-422以及RS-485串口的基本区别是什么?
解答:
下面的表格比较了:
工作方式,驱动器和接收器的总数,电缆的最大长度及最大传输速率。
RS-232是大多数计算机通用的接口,比如COM1和COM2。
注意,大多数计算机的接口COM1以及COM2并不是RS-422/RS-485。
然而,RS-422是苹果Macintosh计算机的标准接口。
RS-485是基于RS-422的一种改进,在工业中更普遍。
所有NI的RS-485板卡都支持RS-422标准。
串行通讯的基本架构是什么?
串口通讯架构
每一个异步串行系统的核心都是一个UART(通用异步接收机/发送机)。
UART不仅控制传输的数据,相应的电平,同时也控制通讯的速度。
UART能够存储足够的信息,所以保证了在电脑忙得时候,数据流也能连续传输。
这对于同时处理大量任务的操作系统非常有帮助。
下面附图是理想串行通讯的示意。
我们大部分的串行卡都有一个输入输出的FIFO(查看目录了解详细信息)。
FIFO的数据可以通过串行驱动获取。
串行驱动会自动地把FIFO的数据传输到软件的缓存,这个缓存是可以在应用软件由用户配置的(比如,在LabVIEW您可以使用SerialPortInitVI来设置缓存去大小)。
读接口的数据实际上包含从软件缓存读的过程。
确认硬件操作的回路测试
有三种方式确认串口的操作:
LabVIEW,超级终端和LabWindows/CVI。
这三种方式进行回路测试是把串口的发送和接受引脚短接。
第一步描述短接引脚的过程。
LabVIEW的处理写在下面,而超级终端和LabWindows/CVI的过程在本文后面的链接里。
对于LabVIEW建议使用如下步骤:
a,连接一根电缆到串口。
最常用的RS-232电缆是9针或者25针(DB-9或者DB-25)。
在电缆端把2、3引脚短接。
这会把计算机发送数据的线连接到接收数据的线。
一旦短接,BD-9的上一排变成【12=345】。
对于RS-485端口,电压是差分的。
因此,你必须短接TXD+和RXD+、TXD-和RXD-(对于DB-9电缆,连接pin4到pin8和pin5到pin9;
对于模块化接口,连接pin2到pin6和pin3到pin7;
对于Combicon接头,连接pin1到pin5和pin2到pin4。
)确保你的软件配置为4线模式。
在LabVIEW中应用串口
第一部分使用LabVIEW系统VI
一、串口VI介绍
LabVIEW的串口通讯VI位于InstrumentI/OPlatte的Serial中,包括:
VI名称
VI功能
VISAConfigureSerialPort
初始化VISAresourcename指定的串口通讯参数
VISAWrite
将输出缓冲区中的数据发送到VISAresourcename指定的串口
VISARead
将VISAresourcename指定的串口接收缓冲区中的数据读取指定字节数的数据到计算机内存中
VISASerialBreak
向VISAresourcename指定的串口发送一个暂停信号
VISABytesatSerialPort
查询VISAresourcename指定的串口接收缓冲区中的数据字节数
VISAClose
结束与VISAresourcename指定的串口资源之间的会话
VISASetI/OBufferSize
设置VISAresourcename指定的串口的输入输出缓冲区大小
VISAFlushI/OBuffer
清空VISAresourcename指定的串口的输入输出缓冲区
二、使用说明
在LabVIEW环境中使用串口与在其它开发环境中开发过程类似,基本的流程框图如下。
图1、串口操作数据流图
首先需要调用VISAConfigureSerialPort完成串口参数的设置,包括串口资源分配、波特率、数据位、停止位、校验位和流控等等。
图2、初始化串口
如果初始化没有问题,就可以使用这个串口进行数据收发。
发送数据使用VISAWrite,接收数据使用VISARead。
在接收数据之前需要使用VISABytesatSerialPort查询当前串口接收缓冲区中的数据字节数,如果VISARead要读取的字节数大于缓冲区中的数据字节数,VISARead操作将一直等待,直至Timeout或者缓冲区中的数据字节数达到要求的字节数。
当然也可以分批读取接收缓冲区或者只从中读取一定字节的数据。
图3、从串口发送数据
图4、从串口接收数据
在某些特殊情况下,需要设置串口接收/发送缓冲区的大小,此时可以使用VISASetI/OBufferSize;
而使用VISAFlushI/OBuffer则可以清空接收与发送缓冲区。
在串口使用结束后,使用VISAClose结束与VISAresourcename指定的串口之间的会话。
图5、设置缓冲区大小
图6、
清空缓冲区
图7、结束会话/线程
具体的例子可以参考:
examples\instr\smplserl.llb。
第二部分使用MSCOMM控件
在LabVIEW中使用MSCOMM控件,与在VC、VB中使用一样。
同样可以使用中断方式进行接收。
具体的例子可以发
索取。
图8、使用控件的串口收发程序
图9、程序数据流图
首先通过LabVIEW的工具菜单“Tools>
>
Advanced>
ImportActiveXControls”将Microsoft的串口控件-“MicrosoftCommunicationsControl,version6.0”添加到LabVIEW环境中,存放在缺省路径即可,这样在UserControlsPalette里面可以找到这个控件。
图10、添加ActiveX控件菜单
图11、选择添加用户控件
图12、用户控件
将串口控件
放置在FrontPanel上,在框图程序中用控件属性对其进行编程,实现所需要的功能。
注意:
一个串口资源要有一个MSCOMM控件与之相对应。
第三部分注意事项
一、串口通讯的波特率设置要精确,比如要求9600的波特率,则晶振应选择11.0593MHz或其倍数。
二、由于通常情况下LabVIEW串口VI接收或发送的都是字符串(Normal),所以如果需要发送或接收十六进制数值(Hex),请在发送或接收之前进行必要的转换。
2.1、数值型数据的处理方法:
2.1.1、1、如果这些数据是静态的,也就说在程序设计阶段要传输的数据就已经确定了,在这种情况下,首先设置VISAWrite的writebuffer的显示属性为HexDisplay,然后直接输入要发送的16进制字符串就可以了。
串口设备的控制命令通常是由一个或多个16进制字符组成的,当我们需要对其进行控制时经常会采用这种方法发送控制命令。
2.1.2、数据是动态的;
即要传输的数值型数据是动态产生和变化的,在发送之前首先要将其转换成对应的16进制字符串,才能赋给VISAWrite发送。
将这些数据构成一个数组,用ByteArrayToString进行转换,转换的结果就是对应数组数值的字符串,可以提交VISAWrite发送。
或者使用TypeCast也可以实现同样的功能。
图13、串口数据转换界面
图14、
串口数据转换数据流图
图15、操作界面
图16、单片机C程序
2.2、字符串型数据的处理方法:
我们在处理过程当中,传输的数据可能具有一定格式或协议,比如一个完整的数据帧包括起始段、数据段、校验段等等,而每一段往往又有几个部分组成,这几个部分的类型和长度可能又不尽相同,可能是数值型的,可能是字符型的,也可能是布尔型的,单字节或者是多字节。
此时我们往往都采用统一的字符形式来处理这些数据,因此有时候我们说,字符是LabVIEW里最方便的数据类型。
经过打包的字符数据要经过串口发送需要进行必要的转换,否则传输将出错。
比如我们打包过后需要发送的的字符串为:
3412567894(空格为了区分),如果直接将其赋给VISAWrite发送,串口上的数据将是:
33343132353637383934。
正确的转换程序如下。
图17、字符型数据处理
数据接收:
从计算机串口接收到的数据是16进制的ASCII码,要转换成对应的数值型数据,可以使用StringToByteArray或者TypeCast。
三、LabVIEW串口VI不能使用中断方式传输。