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的数字并组合,此函数可处理 有小数的正负和无小数的正负
//此函数用于接收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;
}