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_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;
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;
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清零,防止内存泄漏,从而造成程序崩塌。
对大家有帮助的话,点赞收藏哦!!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)