STM32 单或者多串口 ASCII 的接收与发收
STM32 单或者多串口 ASCII 的接收与发收
单个串口发送
先重定义,如下
int fputc(int ch,FILE* f)
{
HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1);
return ch;
}
数据量大的可用DMA,亲测有效
int fputc(int ch,FILE* f)
{
while(HAL_UART_Transmit_DMA(&huart1,(uint8_t*)&ch,1)!=HAL_OK);
return ch;
}
发送的内容用printf即可
多串口发送
在实际应用中,我们难免会使用多个串口来发送ASCII,像上面的printf是不能达到效果的。
因此可以采用以下的方法:
//创建一个变量存字符串
char TXDate[]=”abcd“;
//假设用串口一来发送
HAL_UART_Transmit(&huart1,(uint8_t*)&TXDate,strlen(TXDate),strlen(TXDate));
但有时有些应用不只是发单一的字符串,有些变量会在字符串发送,可以利用C语言的sprintf函数的帮助来实现。
//创建一个变量存字符串,数组大小跟实际情况变化
char TXDate[20];
//创建一个发送的变量
float x;
//假设用串口一来发送
sprintf(char,"char:%.2f\n",x);
HAL_UART_Transmit(&huart1,(uint8_t*)&TXDate,strlen(TXDate),strlen(TXDate));
串口的接收
接收ASCII的数字并组合,此函数可处理 有小数的正负和无小数的正负的数字。
//此函数用于接收ascii码的数字,可方便后续的计算
/*
uint8_t *rxbuffer 存放数据的数组
*/
float readstring (uint8_t *rxbuffer)
{
float str = 0;//返回的变量
int sum = 0;
float t = 0,c = 0,z=0,a = -1;//作为中间变量
uint8_t flag = 0;//做标记位,判断有无小数点
for(int i = 0;i<50;i++)//50是因为创建了一个50的数组来存放数据,可根据自己情况改变
{
if(rxbuffer[i]=='.')//记录小数点位置
{
flag =1;
c = i-1;//记录此时的位置
}
if(rxbuffer[i]==0x0D&&rxbuffer[i+1] == 0x0A)//ascii数据接收完毕
{
sum = i-1;//记录次数位置
//数字处理
//没有小数点处理
if(rxbuffer[sum] >= 'A')
{
flag = 2;
}
if(flag==0)
{
//判断正
if(rxbuffer[0]!='-')
{
for(int j = 0;j<=sum;j++)
{
str += (rxbuffer[j]-'0')*(int)(pow(10,sum-t));
t++;
}
}
//判断负
if(uart1_rx_buffer[0]=='-')
{
for(int j = 1;j<=sum;j++)
{
str += (rxbuffer[j]-'0')*(int)(pow(10,sum-t-1));
t++;
}
str = -str;
}
}
//有小数点处理
else if(flag ==1)
{
//判断正
if(rxbuffer[0]!='-')
{
for(int l = 0;l<=c;l++)
{
str += (rxbuffer[l]-'0')*(int)(pow(10,c - z));
z++;
}
for(int p = c+2;p<=sum;p++)
{
str += (rxbuffer[p]-'0')*(pow(10,a));
a--;
}
}
//判断负
if(rxbuffer[0]=='-')
{
for(int l = 1;l<=c;l++)
{
str += (rxbuffer[l]-'0')*(int)(pow(10,c - z-1));
z++;
}
for(int p = c+2;p<=sum;p++)
{
str += (rxbuffer[p]-'0')*(pow(10,a));
a--;
}
str = -str;
}
}
else if(flag == 2)//有字母时不处理
{
str = 0;
}
break;//退出本次处理数据的循环
}
}
return str;
}