printf 打印浮点数

本次使用的串口助手:下载中心 | VOFA-Plus上位机

参考文章: https://zhuanlan.zhihu.com/p/698844348?utm_id=0icon-default.png?t=N7T8https://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);
}

(如有侵权,立马删除)

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值