当前位置:   article > 正文

stm32通过串口发送float数据的方法_stm32怎样发送数值

stm32怎样发送数值

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

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

2、通过sprintf发送

发送端代码如下:

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

 接收端代码如下:

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

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

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

3、通过指针的形式

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

  1. void Usart_SendFloat(USART_TypeDef *USARTx , float data)
  2. {data
  3. float data ;
  4. unsigned char * char_p = NULL;
  5. char_p = (unsigned char *)(&data );
  6. for ( unsigned char i = 0;i < sizeof(float);i++)
  7. {
  8. USART_SendData(USARTx, *(char_p+i));
  9. while( USART_GetFlagStatus(USARTx,USART_FLAG_TXE) == RESET);
  10. }
  11. }

接收端代码如下:

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

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

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/760298
推荐阅读
相关标签
  

闽ICP备14008679号