stm32串口通信

 usart.c代码讲解

u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.

u16 USART_RX_STA=0;       //接收状态标记,bit15,接收完成标志,接收0x0a;bit14,接收到0x0d;bit13~0,	接收到的有效字节数目

u8 aRxBuffer[RXBUFFERSIZE];//HAL库使用的串口接收缓冲


//初始化IO 串口1 
//bound:波特率
void uart_init(UART_HandleTypeDef* huart)
{	
	
	
	HAL_UART_Receive_IT(huart, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
                                                            //aRxBuffer每次接收1个字节(byte)
}


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART1)//如果是串口1
	{
		if((USART_RX_STA&0x8000)==0)//如果未接收到0x0a,接收未完成
		{
			if(USART_RX_STA&0x4000)//如果接收到了0x0d,计数器将不再增加,等待 0x0a的到来
			{
				if(aRxBuffer[0]!=0x0a)//如果接收的不是0x0a
					USART_RX_STA=0;//接收错误,重新开始
				else 
					USART_RX_STA|=0x8000;	//如果接收到0x0a,接收完成了,aRxBuffer[0]=0x0a,标记 USART_RX_STA 的第 15 位,
			}
			else //还没收到0x0d
			{	
				if(aRxBuffer[0]==0x0d)//如果接收到0x0d
					USART_RX_STA|=0x4000;//标记 USART_RX_STA 的第 14 位,
				else
				{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;//将接收数据放到USART_RX_BUF[]里,USART_RX_STA存放接收字节个数
					USART_RX_STA++;//USART_RX_STA(初始化为0),定义接收数据个数,每次接收一个字节,一个循环加一
					if(USART_RX_STA>(USART_REC_LEN-1))//如果大于USART_REC_LEN()
						USART_RX_STA=0;//接收数据错误,重新开始接收;
					                 //如果迟迟没有收到0X0D,那么在接收数据超过USART_REC_LEN(定义最大接收200字节)的时候,则会丢弃前面的数据,重新接收	  
				}		 
			}
		}

	}

}
 

(1)USART_RX_STA这个在0~13位是用来存数据个数的,而14、15位则是通过或运算来将其置1

    可以看到每次结束判断会有USART_RX_STA++;

    接收到0x0d,14位置1;接收到0x0a,15位置1;接收完成,14,15位为1
(2)aRxBuffer这个是接收到的数据,只能存放一个字节数据
    HAL_UART_Receive_IT(huart, (u8 *)aRxBuffer, RXBUFFERSIZE);)

(3)USART_RX_BUF这个是用来保存接收到的数据的,最大接收USART_REC_LEN个字节,默认200字节

    可以看到每次结束判断会有
    USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer ;

 主函数调用

	 if(USART_RX_STA&0x8000)//串口接收处理	;如果USART_RX_STA的15位为1,代表串口完成了一次接收.串口完成一次接收才能执行
		{				   
			len=USART_RX_STA&0x3fff;//len=此次接收到的数据长度(单位:字节)
			
			if(USART_RX_BUF[0]=='-')//加入正反转支持,如果反转
		  {
				for(int i=1;i

本文参考:

正点stm32串口中断理解_Cheesburger的博客-CSDN博客_串口中断是什么意思

STM32串口中断接收标记USART_RX_STA 学习_huaxin2212的博客-CSDN博客_stm32串口接收中断标志位

你可能感兴趣的:(stm32)