本文转载连接: http://blog.csdn.net/liusandian/article/details/52000143
前言:最近做的一个关于串口通信的小项目;具体功能就是实现PC发送指令控制下位机的转动,下位机收到指令并返回响应指令给上位机,完成一问一答式串口通信。之前处理的是电脑发送数据的格式问题,这次解决的是另外一部分问题,即显示下位机返回的16进制指令,以及对VISCA协议的理解和云台不能转动和及时响应指令的问题,一一在这篇文章得到解答。
1. 由于Labview中VISA Read/Write函数都是只能读取/写入字符串数据类型,但有时候需要写入非字符串类型的数据,比如16进制和10进制数据类型等等。导致刚开始接触时候确实有些困惑。
2. 进行数据转换的时候,只要记住计算机中所有数据都是以二进制保存这个原则就容易解决问题了。串口线上传输的也是高低,串口接收到的也是二进制数据,只是到了Labview后被转换成了字符串格式。下面以具体例子解释。
3.1 Labview从串口接收数据
假设上位机软件从串口接收到的数据是“12”(正常显示模式下),那么这个数据在串口底层的时候其实是这样的二进制数据:
00110001 00110010
只是在Labview中,这些二进制数据是以字符串形式显示出来的,他们实质上还是二进制数据,这几个二进制数据转换成16进制分别是“0x31,0x32”,即十进制的“49,50”,由于字符串都是以ASC码的形式保存在计算机里面的,那么49,50这几个数在ASC表中就表示字符串“1,2”.所以这几个数据在Labview中就显示为字符串1,2了。
明白了这层关系,那么进行数据转换就容易很多了。在上面的例子中,如果Labview软件中收到的字符串是“12”,而原本下位机传输的是数值型数据,只需要将12字符转换成对于的ASC码值就是实际上下位机传过来的数据了,就是“49,50”(十进制表示)或者“0x31,0x32”(十六进制表示)
Labview软件中将字符串转换为对应的ASC码的函数是“字符串至字节转换”这个函数:上面针对的是下位机发送的是数值类型的数据,使用“字符串至字节数据转换”这个函数。如果下位机发送的是字符串类型的话,那么在Labview中已经直接转换好了。
上面的是在互联网找到的解决方案,我暂时没有采用,我用的是一个网上下载的已经做好的ASC转HEX小程序模块,直接加入到原来的程序里面,测试之后发现可以实时显示下位机响应指令,只不过程序比上面的方案要稍微复杂一些。
无论下位机发送的是何种类型的数据,Labview从串口接收的时候,总是将8位二进制数作为字符的ASC码解读。
4 其他问题的解决
4.1新的问题;
Labview程序VI的存储路径要放在:labview软件的相关例程存储的默认路径,如果单独移出来的话会出现控件不能加载的情况。这是因为目前测试成功的程序是在原有例程上修改的,而原有例程使用的一些控件的路径是在软件的安装路径里面,所以单独移出程序的时候,这些控件失去作用,程序无效。
解决方案:在原来的程序上直接修改,备份好原有例程。路径不变,默认放在系统路径下,生成一个快捷方式放在自己的文件路径里面。
C:\Program Files\NationalInstruments\examples\Instrument IO\Serial;
4.2 数据格式问题:
由于sony摄像机云台与PC通信是按照VISCA协议来的,而这个协议的通信又是基于16进制传输的,所以需要在关键步骤对数据格式进行转换。
解决方案:在原有的 “连续串口写入和读取”基础上修改程序,在VISAWRITE函数的输入缓冲区加一个常量显示控件;加入十六进制显示输入的指令即可,去掉大的WHILE循环,测试通过,电脑可以通过串口发送指令控制云台的复位;
4.3 云台部分指令无效问题:
之前出现的除了复位和原点指令其他指令无效;只有复位和原点2个指令有用,与厂家的技术支持沟通之后,发现没有考虑到串口协议的问题。之前是用的是RS485半双工通信,但是本次的小项目需要看到下位机实时发过来的16进制指令,以确定sony云台的具体运行状态,比如是否收到指令,动作是否已经完成等等。然后换成RS422全双工通信,可以在串口通信助手看到响应指令,
还有一个原因:设置速度过慢,之前设置的都是0.3度每秒(03 03),非常慢。提高速度之后可以看到云台的转动。因为VV WW这几个位是输入16进制速度指令,在参考的技术EXCEL文件里面有速度对应表,一开始没注意速度的影响,换成高速档(0C )之后,问题瞬间得到解决。但是垂直速度也不能设置过快,以免损坏机器。
5. RS485设置的是半双工模式,只能从上位机发送指令给下位机,下位机的响应指令并不能在上位机收到并显示。换成RS422全双工模式之后,可以看到实时的下位机响应指令。
6.知识点补充:
在labview中使用串口的情况:目前串口的应用一般有2种类型;一种是仪器控制类型的,一般是上位机发送一个指令,然后下位机作出响应,返回数据给上位机,上位机再读取出来,完成一次通信,即一问一答;另一类是被动接收形的,即下位机会一直发送数据上来。这二种类型的串口通信在处理上会不太一样。
6.1仪器控制类型
由于在仪器控制时一般都是这种一问一答的方式,所以叫它仪器控制类型。以仪器控制为例来说一下需要注意的事项。
首先是要确认仪器选择的通信模式是串口通信模式。现在的仪器一般都至少有二种通信模式,一种是RS232,一种是GPIB,如果仪器是设置为GPIB通信的话,RS232是不可能通信上的,所以要先确认一下,方法一般是在仪器面板上选择设置>>远程控制>>GPIB/RS232,各个仪器稍微不同,可以查仪器手册看一下。然后就是确认串口的通信参数的配置,包括波特率、数据长度、校验方法等,有些仪器的某些参数是固定的,比如校验方法固定为奇校验,不能修改,只能在电脑上跟仪器设置为一样的。波特率一般是可以修改的。这些参数的配置一定要根据仪器手册上的来设置。如果参数设置不正确,也能收到一些数据,但一般是乱码,如果收到的数据都是乱码的话,就要先检查一下串口参数设置是否正确了。只有电脑和仪器边的串口参数完全一致时才能收到正确的数据。
接着是要注意发送指令和读回数据之间要有一定的延时,即VISA WRITE和VISA READ之间要有一定的延时,一般200毫秒即可,因为串口是底层硬件,数据从软件到串口上要一点点时间,然后仪器对指令作出响应也要一点点时间,这些时间加起来肯定比软件运行二个节点的时间要短,所以延时是一定要加的。在调试时如果发现正常运行时不能收到数据,但高亮运行就能收到数据,就很有可能是没有加延时的原因!或者是发一个查询指令,但返回的是上一条查询指令的结果,也可能是因为没有延时或延时不够。