论坛元老
 
- 积分
- 10653
- 金钱
- 10653
- 注册时间
- 2017-4-14
- 在线时间
- 2780 小时
|
发表于 2020-5-28 14:15:39
|
显示全部楼层
你是对的,不检查ore标志,开关中断容易死机
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) // 空闲中断
{
USART_ReceiveData(USART1); //清除空闲中断标志
USART1_RX_BUF[USART1_RX_STA&0X7FFF]='\0'; //添加\0,防止字符串处理函数遇不见\0一直不结束
USART1_RX_STA|=0x8000; //标记接收完成了
//添加处理函数,最好主函数查询处理
}
if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET) // 检查 ORE 标志,防止开关总中断死机,放在接收中断前面
{
USART_ClearFlag(USART1,USART_FLAG_ORE);
USART_ReceiveData(USART1);
}
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
u8 res = USART_ReceiveData(USART1); //读取接收到的数据
if((USART1_RX_STA&0X7FFF)<USART1_MAX_RX_LEN-1) //超过数组长度的舍弃,空闲中断后处理数据前来的数据会继续接上
{
USART1_RX_BUF[USART1_RX_STA&0X7FFF]=res;
USART1_RX_STA++;
}
}
} |
|