本次使用的串口助手:下载中心 | VOFA-Plus上位机
参考文章: https://zhuanlan.zhihu.com/p/698844348?utm_id=0https://zhuanlan.zhihu.com/p/698844348?utm_id=0
最近使用TI的板子调试代码时,不知为什么程序运行一会就会跑飞。最后发现是因为使用printf打印多个浮点型数据导致的,刚开始没有注意到,用串口打印数据时发现打印的都是“ 1 ” 。这时才想到keil5是不能直接打印多个浮点型数据。
float类型在内存中是以4个字节的形式存储的,其中前3个字节存储的是整数部分,最后一个字节存储的是小数部分。因此,将float类型的数据转换为字节数组时,需要将整数部分和小数部分分别转换为字节数组,然后将它们拼接在一起。如何判断多个不同数据同时出现呢,就需要每一帧末尾附加尾帧表示发送一次数据已经结束了需要解析了。
数据是从低位到高位依次存上的。
//vofa+官网给出的数据尾帧格式
unsigned char tail[4]{0x00, 0x00, 0x80, 0x7f};
//江科大32单片机发送一个整形的数组的函数
void Serial_SendArray(u8 *Array, uint16_t Length)
{
uint16_t i;
for (i = 0; i < Length; i ++)
{
Serial_SendByte(Array[i]);
}
}
//数据格式更改一下,换位unsigned char
//补充一点c语言知识,c语言中,数组名是数组的头指针。
void Serial_SendArrayChar(unsigned char *Array, uint16_t Length)
{
uint16_t i;
for (i = 0; i < Length; i ++)
{
Serial_SendByte(Array[i]);
}
}
//这样发送一个字节和尾帧就完成了
vofa+ 的JustFloat协议是小端浮点数组形式的字节流协议,纯十六进制浮点传输,节省带宽。此协议非常适合用在通道数量多、发送频率高的时候。和32单片机的协议保持一致。 因此,在32单片机中,需要将float类型的数据转换为四个字节通过串口发送,再发送尾帧就实现了单个浮点数的显示。
void Serial_SendFloat(float data)
{
float x=data;
u8 ch[4]; //u8是单个字节的数据
ch[0]=*((u8*)&x); //取出x的地址,强制转换为u8类型,赋值给ch[0],就可以取出最低位的数值了
ch[1]=*((u8*)&x+1); //x的地址加一就是次低位
ch[2]=*((u8*)&x+2); //。。。
ch[3]=*((u8*)&x+3); //最高位
Serial_SendArray(ch, 4);//调用江科大的函数,实现发送一个浮点数的四个字节的功能
Serial_SendArrayChar(end,4);//发送尾帧
}
多个浮点数组通过串口发送,只需要在发送一个浮点数的基础上,将多个浮点数的的四个字节依次发送即可。
//注意发送多个浮点数的时候,中间是不能发送尾帧的。
void Serial_Float(float data)
{
float x=data;
u8 ch[4];
ch[0]=*((u8*)&x);
ch[1]=*((u8*)&x+1);
ch[2]=*((u8*)&x+2);
ch[3]=*((u8*)&x+3);
Serial_SendArray(ch, 4);
//
}
//根据输入发送数据的长度(需要手动输入)发送多个浮点数组
void Serial_SendArrayfloat(float * Array ,int length)
// 32 send float array({1.0,2.0,3.0,4.0}etc, these are different data not one data in different time ) to vofa+
//input :the array you want to send ,the length of the array
{
uint16_t i;
for (i = 0; i < length; i ++)//循环发送。
{
Serial_Float(Array[i]);
}
Serial_SendArrayChar(end,4);
}
(如有侵权,立马删除)