vofa+是一个非常好用的,免费的电脑串口软件,自带很多图形控件,方便数据可视化.用它来调试PID的参数非常的方便.它有3种通讯协议,分别是,RawData,FireWater,JustFloat.
- RawData就是原始数据流,等于没有协议,选择这个功能的时候vofa+也就相当于是一个串口调试助手.
- FireWater,就是一个字符串流协议,以回车结尾为一帧数据.通俗易懂,但字符串解析消耗更多的运算资源,传输效率低,不适合多通道,大数据量通讯.
- JustFloat,是一种字节流协议,以4个特殊字节为结尾,
小端浮点数组形式
的字节流协议.需要理解一下才可以使用,但传输效率高.此协议非常适合用在通道数量多、发送频率高
的时候使用。
但是c语言新手看到JustFloat协议时有点犯怵.本文就从编程实现的角度来解释一下JustFloat协议,帮助新手理解高效好用的JustFloat协议.
串口通讯本质就是发送一帧数据给上位机.假设发送一个16个字节长度的数据,对于RawData和FireWater协议的帧,不论是字节也好,字符也罢,本质上我们只需要在程序里声明一个字节类型的数组,然后把字节数据或者字符数据装入这个数组,通过串口发送出去即可.
但是,对于JustFloat协议,它的结尾是4个字节,而前面的数据则是float类型的.我们知道float类型的数据一个数据是需要占用4个字节的内存空间的.这样帧结尾用的字节类型数据tail和装载数据用的float类型数据fdata就无法装入一个数组.就得分成两个数组进行加载.
而痛点在于,UART的硬件一般每次只能发送1个字节的数据,因为其数据寄存器就是8位的.
所以用UART发送float数据时,是不能直接把float数据装入其数据寄存器的.所以要对float进行拆分,拆分成4个字节数据,才能依次装入UART的数据寄存器.才能正常发送,这样程序就要多写一道工序去折腾数据,太烦人.
那有没有一个很简单的办法,可以直接把这帧数据发射出去呢?当然是有的,就是使用结构体,只要声明一个结构体,在结构体里有两组数据,定义好数据的长度,在装入数据的时候,我们只要正常的把float数据赋值进入结构体里的float数组,
因为结构体本质上是占用了一个完整的内存空间,跟数组是一样的,最后只要把结构体的指针,强制转化成字节类型,也就相当于把这块内存变成了一个字节类型的数组了,这样就能很方便的把数据赋值给串口的数据寄存器了.
vofa+软件接收到这帧数据的时候,如果使用的是JustFloat协议,那么它会把4个字节合成一个float数据使用.这样是不是就很方便了?