一、项目需求:

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

Labview 串口通信之——PC控制云台方向相关推荐

  1. Labview串口通信

    关键词:labview 串口通信 学习labview有一段时间了,发现了其中功能的强大和编程的简洁性,高效性 现在初步实现了串口的通信,把其中的体会和实现过程写出来,权当抛砖引玉 其中的串口采用的是R ...

  2. labview 串口通信开发基础详解

    串口通信的基本概念 串口通信的基本概念 1,什么是串口? 2,什么是RS-232? 3,什么是RS-422? 4,什么是RS-485? 5,什么是握手? 1,什么是串口? 串口是计算机上一种非常通用设 ...

  3. linux串口工具 SRT,汇编语言实现串口通信(PC和单片机间).doc

    汇编语言实现串口通信(PC和单片机间) 8.用C语言或?汇编语言实?现串口通信?(PC和单片?机间) 上位机和下?位机的主从?工作方式为?工业控制及?自动控制系?统所采用.由于PC机?分析能力强?.处 ...

  4. Labview 串口通信

    内容整理于网络: 一.十六进制和ASCII之间的相互转换 有的仪器进行与labview通信,它以十六进制的形式返回信息.例如,它不会返回字母"L",而是返回它对应的十六进制表示&q ...

  5. Labview串口通信中ASCII码和数值相互转换

    对于串口通信,labview提供了visa的写入和读取函数,网上关于如何使用有大把的介绍,但是其写入和读取都是缓冲区,所以对应的控件都是字符串,在串口通信是,自动转换成字符对应的ASCII码的十六进制 ...

  6. stm32中断方式的串口通信——上位机控制串口收发

    文章目录 前言 一.什么是串口通信 二.什么是中断--STM32 1.中断的概念 2.STM32下NVIC的介绍 3.中断优先级的介绍 4.外部中断的介绍 三.串口通信keil工程文件 1.新建工程模 ...

  7. VC++6.0上实现PC机与单片机串口通信的PC端上位机软件

    1.简介 我做这个的主要原因是选了一个PC和单片机的全双工串口通信作为课设题目,单片机端是用汇编语言编程且要预先下载到板子里,关于这个这里我就不多说,主要说说怎么实现PC端的上位机软件.早知道要写软件 ...

  8. LabVIEW串口通信实际操作

    理论基础: LabVIEW串口通信基础知识 读取串口字节 我们新建一个空白 VI,借助串口调试助手和虚拟串口,在 LabVIEW 中编写的一个最简单的例子:写一个基本的读取串口字节的程序,在程序框图中 ...

  9. 易语言和c51通信,51单片机与PC上位机串口通信之LED控制

    #include #define uint8 unsigned char #define uint16 unsigned int uint8 receive_buffer[6];            ...

最新文章

  1. 竞赛专题(四)特征工程-竞赛中的必杀技
  2. Singleton + Proxy 模式+AOP
  3. c语言编写的程序停止运行程序,C语言中,编译成功但运行停止的几个原因
  4. VTK:绘制bottle瓶子用法实战
  5. svn cvs git的区别
  6. C++总结笔记(八)—— 菱形继承
  7. 如何从javascript检索GET参数? [重复]
  8. python 规则引擎 drools_SpringBoot2整合Drools规则引擎及案例详解
  9. 外观检验人员一致性(Kappa)分析
  10. c++基础三 (数组——指针)
  11. js判断wifi_js判断手机是wifi还是流量
  12. html虚线垂直居中,css-虚线边框滚动效果
  13. 智谱研究报告:揭秘ChatGPT背后的AI“梦之队”
  14. LVS+Nginx实现高可用集群
  15. python分钟转化为小时_Python将分钟转为小时和分钟
  16. 【akka】Akka源码分析-local-DeathWatch
  17. SAP BW/HANA打补丁遇到证书过期问题
  18. php 根据银行卡号获取所属银行
  19. oracle杀缩表进程,oracle查看锁表和杀死锁表的方法总结
  20. Win7 Print Spooler服務自动关闭

热门文章

  1. AdapterView及其子类之四:基于ListView及SimpleAdapter实现列表
  2. 网页设计的12种颜色
  3. 使用mybatis自动生成指定规则的编号
  4. Angular和SAP C4C的事件处理队列
  5. 禁止解析PHP、限制user_agent、php相关配置
  6. SQL优化常用方法41
  7. 阿里云全球首批MVP张建平专访 - 我对数据有执念
  8. bps、Bps、pps
  9. mysq对存在null值的字段排序
  10. glance image-create