近日与网友讨论串口数据接收与类型转换问题,觉得非常典型,可能对网友们有借鉴意义,择其主要部分,与网友们共享。网友简称为AAA.
AAA: 您好,想向您请教个问题,十六进制转单精度浮点数用强制转换,当单独输入数据时,结果是对的,但跟串口相连时,由于不断的产生数据,结果就不对了,不知道怎么回事啊,谢谢!

CSX:接收的数据是什么?

AAA:接收框里显示是乱码,用HEX显示

CSX:你知道对方发送的格式?

AAA:这个是接收到的数据,HEX显示

2E 30 7B 14 A6 41 71 3D A4 41 1F 85 6B 3E F6 28 60 41 E1 7A 64 41 71 3D 8A BE 00 00 00 00 85 EB 21 40 5C 8F 22 40 0A D7 23 BC 00 00 00 00 00 00 00 00 EF

CSX:这些代表什么?

AAA:这个是一包数据,中间48个 是有效数据,以2E 30开头, EF结束,每4个字节代表一个数据

CSX:你显示的不是HEX方式, 似乎是ASCII方式,中间有空格?


AAA:恩,这个是用串口调试助手接收的,LV中是这样的

2E30 E17A A841 7B14 A641 9A99 993E A470 6941 52B8 6E41 C3F5 A8BE 0000 0000 1F85 2B40 F628 2C40 0AD7 23BC 0000 0000 0000 0000 EF

CSX:这样是对的

AAA:哦,E17A A841 是第一个数据,总共12个数据

CSX:不停接收时错了只能说明你拆分的时候错了,必须保证2E30开头,FF结尾这才是完整的帧

AAA:不是的啊,我查了我的数据,拆的是对的
我就是用拆分得到数据单独输入试验的


CSX:你如何知道是错的? 你知道返回的数据?


AAA:下位机有显示 ,转换的结果跟单独输入有很大的差别


CSX:各个环节都是对了 ,不可能有区别,除非你编程有错误 ,贴一下你的程序


AAA:不好意思,我怕贴图不完整啊,还是给你发下吧

(AAA创建了几个VI,非常大而且复杂,其中之一如下图所示:

Picture
CSX:重新设计这些VI吧 ,很简单的问题,如果都这样处理,那你的软件无法做了


CSX:你想这个VI完成什么功能?

AAA:这块主要是判断有的地方数据为零时,需要吧零加上

CSX:为什么要加0?
你的串口是不断发送数据还是你发送命令后下位机才应答?


AAA:发送命令才应答

CSX:那就是发送一个命令后,返回固定长度字符串2E30开头?

AAA:是的

CSX:那很简单啊 ,从第3个字节开始,每四个字节一组


AAA:但数据一次接收不完整

CSX:固定长度,肯定完整啊

AAA:一次接收不到一个完整的数据包,我试过,在VISA读设置51还是读不到51 个

CSX:一个命令后,下位机自然发送这么多啊

AAA:这个不清楚了,确实一次读不全数据

CSX:不要考虑处理,先考虑协议问题,计算机发送什么命令?


AAA:FE2E 0101EE
读取一包数据的命令


CSX:你用调试工具能返回完整帧吧 ,一帧51个字节?


AAA:是的

CSX:我明白了,8F 22 40 0A D7 23,问题出在0A上,回车换行自动结束了本次读 

CSX:VISA 配置时取消结束字符就可以了,必须为FALSE,默认为TRUE

 

Picture
CSX:VISA 串口读操作在三种情况下结束读操作:1、读到指定字节数。2、读到结束字符,默认为回车。3、超时。

CSX:默认结束符号为0A,所以数据中有0A就结束了

AAA:哦,明白了,谢谢
恩,好的,那数据转换那块怎么处理啊


CSX:那很简单啊,从2E30之后拆分啊,四个字节为一组

 

Picture
(创建完这个VI后,我想到了更为简单转换方法。)

 
Picture
对话结束。

 
 





Leave a Reply.