一、功能
stm32串口接收一个字符串,调用函数把特定形式的字符串(如:[-12.4,43.2,8.13])转化为float型数据,实现单片机见的串口通信。
二、代码
先定义字符串数组和浮点数数组,定义指针指向浮点型数组。
#define MAX_RECV_LEN 1024
uint8_t msg_buff[MAX_RECV_LEN] = {0};
float message[6] = {0};
float *msg = message;
串口重定向。
#include "stdio.h"
/********************串口重定向**********************/
int fputc(int ch, FILE *f){
uint8_t temp[1] = {ch};
HAL_UART_Transmit(&huart1, temp, 1, 2);
return ch;
}
int fgetc(FILE *f){
uint8_t ch;
HAL_UART_Receive(&huart1, &ch, 1, 2);
return ch;
}
主函数while(1)里添加以下代码 。
scanf("%s", msg_buff);
Read_Usart(msg_buff, msg);
printf("%f, %f, %f, %f, %f, %f\r\n", message[0], message[1],
message[2], message[3], message[4], message[5]);
主函数外添加以下代码(注意在主函数前进行函数声明)。
/**
*函数功能 :接收到的数据转换成浮点型
*rx :接收到的字符串
*arrays :浮点型数组
**/
void Read_Usart(uint8_t *rx,float *arrays)
{
static char shuzu[6][8]={0}; //接收数据,每个数据包含小数点和负号可容纳8位(十进制) 发送的字符(包含点.在内)长度最好<8
static int begin=0,x=0,y=0; //有效数据标志,二维数组元素变量
int num;
for(int i=0;; i++){
if(rx[i]=='['){ //起始标志
begin=1;
x=0;
y=0;
}else if(rx[i]==']'){ //结束标志 在结束时字符转换为实数
begin=0;
for(num=0;num<=x;num++)
arrays[num]=(float)atof(shuzu[num]);
memset(shuzu,0,sizeof(shuzu)); //清空数组,初始化为0
break;
}else if(rx[i]==','){
x++;
y=0;
}else if(begin==1){
shuzu[x][y]=rx[i];
y++;
}
}
}
三、测试效果
可以看到字符串数转成float型数据打印出来。
代码参考了「C-百川归海-L」的原创文章。原文链接:https://blog.csdn.net/ABYSS_CL/article/details/118932744