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通过单片机发送的几种方法。

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
浮点数是一种表示实数的数据类型,可以包含小数部分。而串口发送通常使用的是u16(无符号16位整数)类型,它只能表示整数,没有小数部分。 当我们需要通过串口发送浮点数时,需要先将浮点数转换为整数形式再发送。常见的转换方法有以下几种: 1. 乘以一个固定倍数:将浮点数乘以一个固定倍数,然后取整,得到一个整数。在接收端,再将这个整数除以相同的倍数,得到原始的浮点数。 例如,我们可以将浮点数乘以1000,然后发送整数形式的值。接收端收到后再将这个整数除以1000,还原为原始的浮点数。 2. 转换为整数位和小数位两个部分:将浮点数的整数部分和小数部分拆分开,分别发送整数部分和小数部分。在接收端,再将这两个部分合并为浮点数。 例如,浮点数3.14可以拆分为整数部分3和小数部分14,然后分别发送3和14,接收端再将它们合并为3.14。 3. 使用特定的协议:一些串口通讯协议,如MODBUS协议,提供了浮点数的传输格式。可以使用这些协议的相关函数库将浮点数转换为协议要求的格式,然后发送。 无论选择哪种方法,都需要在发送和接收端进行相应的转换才能保证浮点数的正确传输。同时,在进行浮点数传输时,需要注意字节序(大端序或小端序)和精度(位数)的匹配,以免出现数据解析错误的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值