STM32串口接收溢出处理问题
读取GNSS接收机串口数据的时候发现,
我只需要接收时间,所以只需要接收NMEA数据的前40个字节即可定位时间,
于是我用
HAL_UART_Receive(&huart2, (uint8_t*)nmea_buffer, 40, 40);
但是接收了几个回合后发现,其接收的数据总是:
A$GNRMC,134510.00,
(正确应该是$GNRMC,134510.00,A
)
可以得知,最后接收的字节总是跑到第一位去
听过查阅GPT和手册发现
即,如果接受字节小于GNSS发送的字节量,数据寄存器DR总是会存储一位!并把ORE置1。
这就导致了,这一次从数据寄存器DR读取的第一位总是来自于上一次接收的最后一位。
定位了问题后,其解决方法也比较简单
__HAL_UART_CLEAR_OREFLAG(&huart2);
__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_RXNE);
__HAL_UART_FLUSH_DRREGISTER(&huart2);
即,在接受这一回合的串口之前,先清除RXNE,ORE标志位,并且清除数据寄存器DR中残留的数据。
问题解决!