研究生
最后登录1970-1-1
在线时间 小时
注册时间2016-7-21
|
如题,开发板使用串口发送AT命令到通讯模块,接收数据的前几个字节丢失(丢失字节数不定)。串口使用中断接收数据,首先判断接收字节中断,将数据保存到全局变量中。接收完成一帧数据后判断总线空闲中断,并置位一个一帧数据接收完成标志位。此时其它函数可以处理此接收到的全局变量数据。在此中断处理过程中,总是接收不完全所有串口数据,具体中断函数如下,串口配置都一样的,没啥好说的:
- void USART2_IRQHandler(void)
- {
- uint8_t clear,i;
- static uint8_t byte_cnt = 0;
- //如果是监测到总线空闲的中断,说明数据传输完毕。将计数(数组下标)清零、
- //串口接收到时间修改的标志置位,最后记得要清空中断标志,先读SR、再读DR清除
- if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)
- {
- recv_cnt = byte_cnt;//接收到的数据字节数量,数组下标+1
- byte_cnt = 0;//数组下标清零
- framedata_flag = 1;//一帧数据接收完成标致,其它函数处理完后记得清除标志
-
- //清除总线空闲中断标志,先读SR、再读DR清除
- clear = USART2->SR;
- clear = USART2->DR;
- }
-
- //如果是接收到一个字节的中断,将其保存到数组中
- if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
- {
- recv_data[byte_cnt++] = USART_ReceiveData(USART2);//每次接收完一帧数据后数组下标都已清零,因此这里直接使用
- if(byte_cnt >= 255)
- byte_cnt = 0;
- USART_ClearITPendingBit(USART2, USART_IT_RXNE);//清除中断标志
- }
- }
复制代码 比如发送一个AT\r\n, 正常应该返回OK\r\n, 可能实际K\r\n. 也就是说它丢失的只是前面的数据,而非中间后面的数据。经调试,这个问题极可能是由于空闲中断引起的,但具体原因无从查找。
请问大伙儿对此有何良策?
数据发送接收情况测试如下图:
|
|