LabVIEW串口通信浮点小数转四个字节和数据打包
LabVIEW编程的虚拟仪器,作为PC与单片机的上位机,十分直观方便。LabVIEW中控制串口使用VISA十分方便。
串口通信都是发送的一个一个字节,字节中包含需要的信息,有些需要多个字节的组合才能传递一个完整的信息。一般的数据通信都是通过数据包来传递信息的,现在我们要用LabVIEW向单片机发送单精度浮点小数。
现在遇到一些问题:
1.串口发送的都是字节,怎样把浮点小数转换成字节?
2.LabVIEW中VISA串口的写入传送的字符串,如果直接发字符串,单片机得到是字符的ASCII码,单片机无法解析成需要的浮点小数。如何把字符串转换成相应的字节?
3.数据一直向串口传输,为便于单片机解析出想要的数据,如何进行打包?
问题1:
浮点小数在计算机中的存储遵循ieee754协议,实际上一般情况下,各种仪器发送的数据都是按照ieee754协议转换成的字节数据包。我们传递浮点小数,可以按照ieee754协议转换成字节数组。
例如单精度浮点小数8.25转换成字节数组用十六进制表示为41 04 00 00,为四个字节。那么如何通过LabVIEW实现呢,我这儿有个程序利用强制转换来实现,不知是哪位大神写的,反正是十分方便、有效,确实很NB。因为关于强制转换,LabVIEW帮助和网上根本查不到资料,尤其是其上端的连线--类型,根本不知道连接什么量。
程序框图主要利用强制转换和数据拆分来实现ieee754协议转换为四个字符串。
单精度数字SGL(单精度浮点型)类型,经过强制转换,变成I32(32位长整形)类型,再经过两次拆分,得到四个U8(无符号字节,8位整型)类型的数据,再经过数值至十六进制字符串转换,字符宽度为2,得到十六进制整型字符串,再将4个字符连接起来。8.25转换得到41040000。
前面板如下:
问题2:
问题1解决了,把单精度浮点小数转换为四个字节,并连接起来。但是当我们将它们发送到串口,在串口调试助手上用十六进制显示,发现原来我们发送的是它们的ASCII码。我们原意是一个浮点数,发送4个字节,但是却发送了8个字节。因为计算机把这8个字符当成字符来发,自然是8个字节,而不是4个字节。
如上图,当我们把它按照十六进制显示是,就是8个字符的ASCII码。
字符串数组怎么转成byte
为了解决这个问题,我们需要把正常显示下的41040000转换成十六进制显示下的41040000。我在CSDN.NET上看到一篇文章,讲得是如何实现上述过程。
正常显示的字符串,强制转换为十六进制显示。
左侧正常显示,右侧十六进制显示,右侧正常显示下为:
没有看错,就是一串乱码。但是我们要的就是十六进制显示,这是我们得到的就是四个字节,发送到串口的就是41040000,串口调试助手十六进制显示的就是41040000。
问题3:
我们通过解决问题1,得到字符串,可以通过连接字符串的方式,数据包一帧的帧头和帧尾连接起来。
帧头为AC96,帧尾为0D,连接起来后它们是正常的字符串,还需要转换到十六进制显示的格式,方便串口传输。
总体流程如下:
程序框图中,两个子VI分别解决问题1和问题2,加入帧头帧尾在第一个子VI中,最终得到打包后的十六进制数据包,可以进行串口传输,得到是字节数组。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。