串口发送float类型数据

STM32串口发送float类型数据

一、代码

1、发送

void send_gyro(float yaw,float pitch,float roll)
{
	float aaa,bbb,ccc;
	u8 buff[14] = {0};
	char buff_yaw[4],buff_pitch[4],buff_roll[4];
	u8 *p;//中间指针
	buff[0] = 0x10;//帧头
	p = (u8 *)&yaw;//中间指针赋值
	for(int i=1;i<5;i++)
	{
		buff[i] = (u8)(*(p+i-1));
		buff_yaw[i-1] = buff[i];
	}
	p = (u8 *)&pitch;//中间指针赋值
	for(int i=1;i<5;i++)
	{
		buff[i+4] = (u8)(*(p+i-1));
	}
	p = (u8 *)&roll;//中间指针赋值
	for(int i=1;i<5;i++)
	{
		buff[i+8] = (u8)(*(p+i-1));
	}
	for(int i=0;i<13;i++)
	{
		buff[13] += buff[i];
	
	}
	for (int i=0;i<14 ;i++)
	{   
		USART_SendData(USART1, buff[i]);
//		while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);	//判断缓存区是否清零
		while(USART_GetFlagStatus(USART1, USART_FLAG_TC) ==RESET);  // 判断是否发送完成
	}
}

2、接收

float Yaw,Pitch,Roll;
void USART2_IRQHandler (void)
{
	char res=0;
	char buff_yaw[4] = {0},buff_pitch[4] = {0},buff_roll[4] = {0};
	static char fly[15] = {0},fl = 0;
//	USART_OUT(USART1,"222");
	if (USART_GetITStatus(USART2, USART_IT_RXNE) !=RESET)										
	{
		res = USART2->DR;
		fly[fl] = res;
		if(fly[0] == 0x10)
		{
			fl++;
			if(fl > 13)
			{
				for(int i=0;i<13;i++)
				{
					fly[14] += fly[i];
				}
				if(fly[13] == fly[14])
				{
					fly[13] = 0;fly[14] = 0;
//					USART_OUT(USART1,"44");
					fl = 0;
					buff_yaw[0] = fly[1];
					buff_yaw[1] = fly[2];
					buff_yaw[2] = fly[3];
					buff_yaw[3] = fly[4];
					Yaw = *(float*)buff_yaw;
					
					buff_pitch[0] = fly[5];
					buff_pitch[1] = fly[6];
					buff_pitch[2] = fly[7];
					buff_pitch[3] = fly[8];
					Pitch = *(float*)buff_pitch;
					
					buff_roll[0] = fly[9];
					buff_roll[1] = fly[10];
					buff_roll[2] = fly[11];
					buff_roll[3] = fly[12];
					Roll = *(float*)buff_roll;
					
					printf("Yaw=%f      Pitch=%f       Roll=%f\r\n",
					Yaw,Pitch,Roll);
					
				}else{
					for(int i = 0;i<13;i++)
					{
						fly[i] = 0;
					}
					
					fl = 0;
				}
			}
			
		}else{
			for(int i = 0;i<13;i++)
			{
				fly[i] = 0;
			}
			
			fl = 0;
		}
		USART_ClearFlag(USART2, USART_FLAG_RXNE);                              //清楚标志位
	}
}

二、总体思路

​ 发送采用指针形式进行发送,将float解析成四个字节,分别使用数组进行存放,由于串口只能一位一位的进行发送,所以使用串口将float构成的数组一位一位的进行发送后,在接收端同样使用相同的数组结构进行接收,然后使用强制转化,得到float类型数据。关于float类型的大端小端等等详解,网上有资料,我这就不解释了。

三、发送重点和踩坑

​ 1、发送时必须使用校验位,帧头,不使用的话数据是散装的,发过去组成的float类型可能正确,大概率错误。

​ 2、得到的float类型存储在数组中时注意指针偏移,是从0位~3位的,要是错误会造成地址数据覆盖,导致数据在接收端整合发生错乱。

​ 3、发送端在有线传输的情况下理论上不需要加延时

​ 4、发送结束加上判断位,加第二条,判断是否发送完成。加第一条判断缓存区是否清零有风险,在数据还未发送完成时缓存区清零,导致下一条数据发送,造成丢包现象。

while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); //判断缓存区是否清零
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) ==RESET); // 判断是否发送完成

​ 5、可以增加结束帧,使用发送端数据相加,得到动态结束帧,在接收端进行接收数据相加,从而判断数据是否正确。切记数据初始化。

四、接收重点和踩坑

​ 1、同样,接收照着发送的方式进行编写,将每一组数据分好,从而强转得到float数据

​ 2、记得标志fl清零,防止内存泄漏,从而造成程序崩塌。

对大家有帮助的话,点赞收藏哦!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值