代码如下:
-
void USART1_IRQHandler(void)
-
{
-
u8 res;
-
#ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
-
OSIntEnter();
-
#endif
-
if(USART1->SR&(
1<<
5))
//接收到数据
-
{
-
res=USART1->DR;
-
if((USART_RX_STA&
0x8000)==
0)
//接收未完成
-
{
-
if(USART_RX_STA&
0x4000)
//接收到了0x0d
-
{
-
if(res!=
0x0a)USART_RX_STA=
0;
//接收错误,重新开始
-
else USART_RX_STA|=
0x8000;
//接收完成了
-
}
-
else
//还没收到0X0D
-
{
-
if(res==
0x0d)
-
USART_RX_STA|=
0x4000;
-
else
-
{
-
USART_RX_BUF[USART_RX_STA&
0X3FFF]=res;
-
USART_RX_STA++;
-
if(USART_RX_STA>(USART_REC_LEN
-1))USART_RX_STA=
0;
//接收数据错误,重新开始接收
-
}
-
}
-
}
-
}
-
#ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
-
OSIntExit();
-
#endif
-
}
USART_RX_STA是状态标记变量,从0开始,串口中断接收到一个数据(一个字节)就自增1。当数据读取全部OK时候(回车和换行符号来的时候),那么 USART_RX_STA的最高位置1,表示串口数据接收全部完毕了,然后main函数里面可以处理数据了。
当接收到从电脑发过来的数据,把接收到的数据保存在USART_RX_BUF 中,同时在接收状态寄存器(USART_RX_STA)中计数接收到的有效数据个数,当收到回车(0X0D,0X0A)的第一个字节0X0D 时,计数器将不再增加,等待0X0A 的到来,而如果0X0A 没有来到,则认为这次接收失败,重新开始下一次接收。如果顺利接收到0X0A,则标记USART_RX_STA的第七位,这样完成一次接收,并等待该位被其他程序清除,从而开始下一次的接收,而如果迟迟没有收到0X0D,那么在接收数据超过64 个了,则会丢弃前面的数据,重新接收。