stm32通过串口发送float数据的方法

1、通过将小数转化为整形

小数×100或者1000倍之后放在两个字节里面发送,接收端将两个字节解析出来后÷100或者1000即可,缺点损失精度

2、通过sprintf发送

发送端代码如下:

    float data[6] = {0};
    g_usart4_tx_buf[0] = 0x5A;
    for(uint8_t i = 0; i < 6; i++)
    {
        sprintf((char *)&g_usart4_tx_buf[1+9*i],"%.6f,", data[i]);
    }
    g_usart4_tx_buf[55] = 0xA5;
    HAL_UART_Transmit(&huart1, (uint8_t*)g_usart4_tx_buf, 56, 100);
    while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET);           /* 等待发送结束 */

 接收端代码如下:

    float data_r[6];
    char* token = strtok((char *)&g_usart4_tx_buf[1], ",");    // 解析数据
    int i = 0;
    while (token != NULL && i < 6) {
        data_r[i++] = atof(token); // 将子字符串转换为浮点数
        token = strtok(NULL, ",");
    }
    printf("Received data:\n");
    for (int j = 0; j < 6; j++) {
        printf("%f\n", data_r[j]);
    }

这里我没有去判断帧头帧尾,直接从g_usart4_tx_buf[1]开始解析的,大家可以自己加上帧头帧尾后识别。

该方法自由发挥效果比较好,想怎么组合就怎么组合,但是实际运行中发现当float数据小数点前面位数较多时会出现只能解析出第一个数据的情况,因此去研究了其他的方法。

3、通过指针的形式

float类型的数据占用4个字节32位,我们利用uint8_t类型的指针指向float数据的地址,并逐一偏移进行发送数据。代码如下:

void Usart_SendFloat(USART_TypeDef *USARTx , float data)
{data
   float data ;
   unsigned char * char_p = NULL;
   char_p = (unsigned char *)(&data );
   
   for ( unsigned char i = 0;i < sizeof(float);i++)
   {   
   	 USART_SendData(USARTx, *(char_p+i));
     while( USART_GetFlagStatus(USARTx,USART_FLAG_TXE) == RESET);
   }
}

接收端代码如下:

for (unsigned char i = 0; i < sizeof(float); i++)
{
	RX_Buf[i] = Receive_Buff[i]; //接收来自串口的数据
}
Float_Data = *(float *)(RX_Buf);//转换为float数据
memset(RX_Buf,0,sizeof(RX_Buf));	//清除缓存数据

该方法要注意接收端跟发送端是否都是小端模式或者大端模式,如果模式不一致四个字节的接收数据顺序要有所改变才行。

4、通过共用体的形式传输

共用体内部定义一个4个字节的数组,定义一个float类型的数据即可自动完成float到四个字节的切换。参考代码如下:

union Data
{
    char str[4];//float占用4个字节所以给四个字符
    float num;
};
union Data  send_data,receive_data;   
g_usart4_tx_buf[0] = 0x5A;
for(int8_t i =0; i < 6; i++)
{
    send_data.num = data[i];
    g_usart4_tx_buf[i*4 + 1] =  send_data.str[0];
    g_usart4_tx_buf[i*4 + 2] =  send_data.str[1];
    g_usart4_tx_buf[i*4 + 3] =  send_data.str[2];
    g_usart4_tx_buf[i*4 + 4] =  send_data.str[3];
}
g_usart4_tx_buf[4*6+1] = 0xA5;
HAL_UART_Transmit(&huart1, (uint8_t*)g_usart4_tx_buf, 26, 100);

上面写的是发送端的代码,接收端只需要定义一个一摸一样的接收共同体,判断完帧头帧尾后将数据一一对应的存放到四个数组里面,只需要读取float类型即可成功解析出数据。

以上便是float通过单片机发送的几种方法。

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值