赞
踩
小数×100或者1000倍之后放在两个字节里面发送,接收端将两个字节解析出来后÷100或者1000即可,缺点损失精度
发送端代码如下:
- 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数据小数点前面位数较多时会出现只能解析出第一个数据的情况,因此去研究了其他的方法。
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个字节的数组,定义一个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通过单片机发送的几种方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。