初级会员

- 积分
- 144
- 金钱
- 144
- 注册时间
- 2016-9-3
- 在线时间
- 26 小时
|
发表于 2017-6-9 15:10:32
|
显示全部楼层
本帖最后由 stm32zzq 于 2017-6-9 15:28 编辑
USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除中断标志 这句话是多余的,因为在上一句中读取DR寄存器的时候已经清除标志位了,另外你的逻辑有些错误,你可以先把你的想法按步骤一步一步注释下,然后跟着节奏走,我可以给你个参考,bit15和bit14两个标志位就OK了,另外你的头数据写错了,写成了0x7B,你上面的注释是0x7A//程序如下
void USART1_IRQHandler(void)
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收到数据
{
Res = USART_ReceiveData(USART1); //读取接收到的数据
if(!(USART_RX_STA & 0x8000))//接收未完成,未接收到0x7D
{
if(USART_RX_STA > (USART_REC_LEN - 1))USART_RX_STA = 0;//数据量超标,直接清空,这里最好加个清空缓冲区的操作
USART_RX_BUF[USART_RX_STA & 0x3FFF] = Res; //记录接收到的值
USART_RX_STA++; //接收数据增加1
if(USART_RX_STA & 0x4000)//已经接收到0x7A头
{
if(0x7D == Res)//现在接收到尾0x7D
{
USART_RX_STA |= 0x8000; //接收完成了
}
}
else //刚才还没收到0x7A
{
if(0x7A == Res)//现在收到0x7A
{
USART_RX_STA |= 0x4000;//标志着接收到头
}
}
}
}
}
|
|