你不会用VOFA+调试PID的痛点在哪里?我懂

 

vofa+是一个非常好用的,免费的电脑串口软件,自带很多图形控件,方便数据可视化.用它来调试PID的参数非常的方便.它有3种通讯协议,分别是,RawData,FireWater,JustFloat.

  1. RawData就是原始数据流,等于没有协议,选择这个功能的时候vofa+也就相当于是一个串口调试助手.
  2. FireWater,就是一个字符串流协议,以回车结尾为一帧数据.通俗易懂,但字符串解析消耗更多的运算资源,传输效率低,不适合多通道,大数据量通讯.
  3. 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数据使用.这样是不是就很方便了?

参考文献:https://dgrt.cn/a/2072895.html?action=onClick

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值