STM32 單或者多串口 ASCII 的接收與發收

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章