u16 USART_RX_STA=0; //接收状态标记
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
if( USART_GetFlagStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)(0x0D是回车的ASCLL码,0x0A是换行的ASCLL码)
{
Res = USART_ReceiveData(USART1); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)//接收未完成 1000 0000 0000 0000
{
if(USART_RX_STA&0x4000)//接收到了0x0d 0100 0000 0000 0000
{
if(Res!=0x0a)
{
USART_RX_STA=0;//接收错误,重新开始--接收到了0X0D但是没有接受到0x0A
}
else
{
USART_RX_STA|=0x8000; //接收完成了--0x0d后面是0x0a
}
}
else //还没收到0X0D
{
if(Res==0x0d)
{
USART_RX_STA|=0x4000; //再次判断这次接收到的是不是0x0d
}
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res; //0011 1111 1111 1111
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))
{
USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
}
u16 receiveLen=0; //接收数据长度
//其他函数中处理接收到的数据
void fun(void)
{
if(USART_RX_STA&0x8000)//接收完成
{
receiveLen = USART_RX_STA&0x3fff;//本次接收有效数据长度
DataPro();//数据处理
memset(USART_RX_BUF, 0, receiveLen);//清空
USART_RX_STA=0;
}
}
记正点原子stm32--串口通信实验讲解里关于USART_RX_STA的代码
最新推荐文章于 2024-05-21 21:10:44 发布