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;
}