Labview 串口通信之——PC控制云台方向

来源:互联网 发布:金如意软件 编辑:程序博客网 时间:2024/05/17 09:03

一、项目需求:

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(简称232RS232)。它被广泛用于计算机串行接口外设连接。连接电缆机械、电气特性、信号功能传送过程。

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

 

0 0