一、项目需求:
1. 完成上位机与下位机的串口通信
2. 上位机电脑给下位机发送16进制指令,控制摄像机云台的各个方向。
3. 该程序用Labview开发
二、开发过程:
1. 开发平台搭建:
开发过程用到的几个软件介绍:
(1) 串口调试助手
(2) VPSD XP5(虚拟串口软件)
(3) Labview
(4) Sony云台自带软件(类似于串口调试助手)
2. 各个软件介绍:
3. 打开VSPD,界面如下图所示:
左边栏最上面的是电脑自带的物理串口。点右边的addpair,可以添加成对的串口。一对串口已经虚拟互联了,如果添加的是COM3、COM4,用COM3发送数据,COM4就可以接收数据,反过来也可以。
4.串口调试助手
可以看到虚拟出来的串口COM3、COM4,选择COM4,设置为波特率9600,无校验位、8位数据位,1位停止位。
5. RS232
RS-232接口符合美国电子工业联盟(EIA)制定的串行数据通信的接口标准,原始编号全称是EIA-RS-232(简称232,RS232)。它被广泛用于计算机串行接口外设连接。连接电缆和机械、电气特性、信号功能及传送过程。
6.同步传输和异步传输
同步传输通常要比异步传输快速得多。接收方不必对每个字符进行开始和停止的操作。一旦检测到帧同步字符,它就在接下来的数据到达时接收它们。
7.同步异步传输的区别
1)异步传输是面向字符的传输,而同步传输是面向比特的传输。
2,)异步传输的单位是字符而同步传输的单位是桢。
3,)异步传输通过字符起止的开始和停止码抓住再同步的机会,而同步传输则是以数据中抽取同步信息。
4,)异步传输对时序的要求较低,同步传输往往通过特定的时钟线路协调时序。
5,)异步传输相对于同步传输效率较低。
三.近距离通信,RS232
3.1简单连接:
当通信距离较近时,可不需要Modem,通信双方可以直接连接,这种情况下,只需使用少数几根信号线。最简单的情况,在通信中根本不需要RS-232C的控制联络信号,只需三根线(发送线、接收线、信号地线)便可实现全双工异步串行通信,即是这里要讨论的第一种情况。
无Modem时,最大通信距离按如下方式计算:
RS-232C标准规定:当误码率小于4%时,要求导线的电容值应小于2500PF。对于普通导线,其电容值约为170PF/M。则允许距离L=2500PF/(170PF/M)=15M
这一距离的计算,是偏于保守的,实际应用中,当使用9600bps,普通双绞屏蔽线时,距离可达30~35米。
3.2、零Modem 的最简连线(3线制)
图3是零MODEM方式的最简单连接(即三线连接),图中的2号线与3号线交叉连接是因为在直连方式时,把通信双方都当作数据终端设备看待,双方都可发也可收。在这种方式下,通信双方的任何一方,只要请求发送RTS有效和数据终端准备好DTR有效就能开始发送和接收。
(1)RTS与CTS互联:只要请求发送,立即得到允许
(2)DTR与DSR互联:只要本端准备好,认为本端立即可以接收(DSR、数传机准备好)。
3.3 串口问题汇总:
3.31串口资源被占用:
这时候在LabVIEW会报错,提示串口号存在,但当前不能对其进行操作,同时打开MAX时也可以在对应的串口号下看到同样的错误,这表示这个串口已经被其它程序占用了,比如有时候打开了串口调试助手来调试串口,然后又想在LabVIEW里面试一下,这时就会报这个错,因为串口已经被串口调试助手调用了,它不能被二个程序同时使用。
解决的方法是关掉其它程序即可,串口调试助手里也可以关闭这个串口。
还有一种情况是调试OK后生成EXE,运行EXE也出现这个问题,这时是因为串口被原来的LabVIEW程序打开,再用EXE打开时就会报错,解决办法是关掉原来的LabVIEW程序。最好是关掉LabVIEW.
在使用串口的过程中一定要关闭串口(使用VISA CLOSE),否则程序在退出的时候会报错说数据丢失。
四.关键数据格式转换问题
4.1使用LabVIEW发送数据
还有一个问题是使用LabVIEW发送数据的问题
①如果下位机接收的是字符串数据类型的话,直接用VISA写入对应的字符串就行了,现在的仪器一般都是接收字符串的,所以可以直接使用VISA发送而不需要转换。
②如果下位机接收的是数值型数据的话,就需要转换一下,其中数值型又是十进制和十六进制二种用得比较多,这二种数据间相互转换一下就行了,其实是一样的。
由于在LabVIEW中字符串直接有十六进制的显示方式,所以发送十六进制的数据比较方便,比如要发送十六进制数值类型的“0xAF”,那么在VISA Write的写入缓冲区字符串常量上右键>>十六进制显示,如图1,直接输入“AF”即可,那么下位机接收到的就是正确的数据(十六进制数值类型)了。
但实际使用过程中,一般都是需要将某个子VI输出一个动态的字符串通过VISAWrite发送到下位机的,这时候就需要对数据进行转换一下,这个转换过程描述起来就是:将字符串A转换为字符串B,使得正常显示的字符串A跟十六进制显示的字符串B是一样的。
由于转换目标(十六进制显示的字符串)的数据类型是十六进制,要想十六进制显示的字符串跟正常显示的字符串一样,这个正常显示的字符串必须都是十六进制的字符,即只能由0-9,A-F这十六个字母中的字母组合而成。否则就没办法使二种显示方式的字符串一致了。
这个转换过程首先将字符串转换为十六进制数值型,然后再通过将这个十六进制数值创建为一个数组,最后再使用“字节数组至字符串转换”这个函数转换为字符串即可,实际上就是图5字符串转换为U8字节的反向操作,只不过是这个十六进制的值初始类型是十六进制,要先转换为数值类型。具体程序如下图所示。
由于十六进制数据由二个字节构成,而字符只有一个字符,所以每二个字符表示一个十六进制数据,如果字符多于二个的话要先进行截取,每二个字符转换为一个十六进制数据。也可以用空格将正常显示的字符串每二个字符用一个空格断开,然后先将这个字符串以空格为分隔符转换为一个字符串数组,再转换为十六进制数值再转换为字符串。
需要注意一下的是如果正常显示的字符串并不是2的整数倍,那么上图的转换程序就会少转换一个字符,可以用程序动态判断一下这个字符串的长度,如果是奇数的话在它最左边补一个“0”再使用上面的程序就正常了。
4.2 LabVIEW从串口接收数据
①假设LabVIEW从串口接收到的数据为“1234”(正常显示模式下),那么这个数据在串口底层的时候其实是这样的二进制数据:
0011000100110010 00110011 00110100
只是在LabVIEW中,这些二进制数据是以字符串形式显示出来的,它们的实质还是二进制数据,这几个二进制数据转换为十进制数据分别是“49,50,51,52”,由于字符串都是以ASCII码形式保存在计算机中的,那么49,50,51,52这几个数在ASCII表中就表示是字符串“1,2,3,4”。所以这几个数据在LabVIEW中就显示为字符串的1,2,3,4了。如果明白这里面的转换关系,那么要进行数据转换时就很容易了,比如上面的例子中,如果LabVIEW中接收到的是字符串“1234”,而原本下位机传送的是数值型数据,只需要将“1234”字符串转换为对应的ASCII值就是实际上下位机传上来的数据了,就是“49,50,51, LabVIEW中将字符串转换为对应的ASCII值的函数是“字符串至字节数组转换”这个函数。
上面说的是下位机发送的是数值类型的数据的,使用“字符串至字节数组转换”这个函数. ②如果是下位面发送的是字符串类型的数据,那么LabVIEW已经直接转换好了。
个人总结:无论下位机发送的是何种类型的数据,LABVIE从串口接收的时候,总是将每8位二进制数,作为字符的ASCII码解读。
4.3 关键问题解决:
贴了那么多资料,最终还是要回归到具体解决的问题上来。本次做的小项目,总体来说,开发周期比较短,程序功能比较简单,但是涉及到的知识面比较多,知识点多而杂乱,所以对这部分资料做了相关整理,权当对思路的整理。
本次遇到的问题:
PC与摄像机云台通信过程中,开发的程序第一版可以完成虚拟串口之间的数据通信,但是问题是实际测试中还是不能控制云台。检测了相关指令也没发现错误。
后来发现Labview程序无论是接收还是发送数据都是以字符串格式完成的,所以当客户要求用16进制完成下位机与上位机通信的时候,问题就出现了。最开始设计程序的时候也没考虑到这个问题。
(1) 将16进制转化成asc码:
这个方法行不通,数据发下去还是不行。继续找资料,找到下面的解决方案:
(2) 在Labview软件中设置字符串的显示格式
Labview软件中设置字符串的显示格式为:16进制显示(也就是:Hex display);
具体做法参考以下链接:
http://blog.csdn.net/liusandian/article/details/51912000