Labview通过RS422通讯接口PC与下位机通信
前言:最近做的一个关于串口通信的小项目;具体功能就是实现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毫秒即可,因为串口是底层硬件,数据从软件到串口上要一点点时间,然后仪器对指令作出响应也要一点点时间,这些时间加起来肯定比软件运行二个节点的时间要短,所以延时是一定要加的。在调试时如果发现正常运行时不能收到数据,但高亮运行就能收到数据,就很有可能是没有加延时的原因!或者是发一个查询指令,但返回的是上一条查询指令的结果,也可能是因为没有延时或延时不够。
Labview通过RS422通讯接口PC与下位机通信相关推荐
- 【上位机与下位机通信】使用WIFI模块ESP8266连接单片机与上位机通信
文章目录 前言 一.ESP8266模块与STM32连接 二.单片机代码 三.总结 前言 承接上文WIFI上位机部分:[上位机]通过WIFI上位机与网络调试助手通信绘制曲线,现阶段实现了STM32单片机 ...
- QT5实现串口收发数据(上位机与下位机通信)
最近帮老师做一个应用程序,通过上位机与下位机进行串口通信,最后实现实时绘图,通过几天努力,成功实现蓝牙串口通信. 参考博客1 注意:代码中一些与串口无关代码,可以忽略掉 一.QT5串口基础知识 1. ...
- 3.3-上位机与下位机通信构架源代码编写与使用方法说明
一.测试框架所使用的示例命令定义 本框架的示例代码所使用的命令协议规定如下: CRC校验码 = [命令类型码 + 命令码 + 命令参数] 一个完整封包 = [包头 + 包长 + 命令类型码 + 命令码 ...
- labview与下位机通信的格式问题处理
泡 论坛 没多长时间,但是从这里真的得到很多人的帮助,先谢谢! 因为最近一段时间在做一个上位机的开发需要用到串口 通信 ,而且用户强制要求要十六进制收发(后来才知道的,所以耽误了一些时间,希望大家以后 ...
- ros与下位机通信常用的c++ boost串口应用
一.首先移植c++ boost 库: 1. 先去 Boost官网 下载最新的Boost版本, 我下载的是boost_1_6_0版本, 解压. 2. 进入解压后目录: cd boost_1_6_0, 执 ...
- python编程与下位机通讯_ros 与下位机通信
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- java实现上位机与下位机串口通信
串口通信是在工程应用中很常见.在上位机与下位机通讯过程中常通过有线的串口进行通信,在低速传输模式下串口通信得到广泛使用.在说个之前先来简单解释一下上位机与下位机的概念. 上位机与下位机 通常上位机指的 ...
- 上位机和MYSQL连接_上位机下位机串口通信设计详解
串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件.一般完成这种功能的电路,我们称为串行接口电路. 串口通信结 ...
- s7.net 写数据到plc_机器视觉软件开发系列——松下PLC下位机通信协议简介和实现...
前些章节我们理解和实现了三菱PLC的MC协议以及实现,接下来我们看看松下PLC的协议以及实现,在我的文章系列中,我会把常用的PLC的协议以及实现都讲解一次,以供大家在使用的过程中减小重复工作,也供大家 ...
最新文章
- SAP MM 中级之事务代码MICN的相关逻辑
- php代码 2012057
- 让 .NET 程序 Autorun
- JavaScript的一些常用方法
- CF 1174 D. Ehab and the Expected XOR Problem 异或技巧
- LSTM(序列标注,自实现)
- MFC- OnIdle空闲处理
- 左右c++与java中国的垃圾问题的分析与解决
- 曲线拟合最小二乘法优缺点_最小二乘法、回归分析法、灰色预测法、决策论、神经网络等5个算法的使用范围及优缺点是什么?...
- 虚拟化: 物理CPU与VCPU的关系 || 内存上限说起 VMware内存分配初探
- 一款简单易用的web报表工具
- 原来收汇宝真的是很烂
- 钉钉自定义机器人提示报警信息
- js/javaScript通过setTimeout做动画和需要注意的点
- 在/tmp 目录创建临时文件
- this与supper
- ThinkPHP5整合原生Swoole实现NBA比赛图文直播以及聊天室功能
- ThingsBoard安装
- Flex布局中的flex属性
- 超导磁体的安装准备条件
热门文章
- SQL 模糊查询技术
- 文本编辑器Nano实用快捷键
- PHP后期静态绑定概念和用法
- openstack之虚拟机管理命令
- 测试框架 Jest 实例教程
- 【“探探”为例】手把手教你用最少的代码实现各种“机器人”
- 12.10 Nginx访问日志 12.11 Nginx日志切割 12.12 静态文件不记录日志和过期时间
- 用TensorFlow和TensorBoard从零开始构建ConvNet(CNN)
- [elixir! #0037] Agent 小传
- 如何寻找高质量流量日入三百+