问题现象
两块MCU板之间使用串口通过modbus协议通信,主机使用STM32F103,从机使用STM32H743。两块板在通信之后,主机很快就会报断连错误。相同的硬件和软件方案在其它设备,运行没出现这个问题。
查找问题,发现主机MCU程序在正常运行,且一直在发送modbus指令。从机MCU程序也在正常运行,但没有回应主机modbus指令。
问题原因
通过在线仿真,发现出现断连错误后,从机串口寄存器USART_RDR数据再也没有更新。
进一步查看寄存器,发现USART_ISR寄存器溢出错误标志位置1。
查看串口与DMA配置代码,发现是禁止FIFO模式,也没有使能接收数据寄存器非空/RXFIFO 非空中断使能。造成从机程序正常运行,但串口接收到的数据都丢失,也自然不会对主机发送的modbus指令有应答。
解决方案
考虑到modbus协议可以自动重发,故每次进入串口后检测是否溢出。若溢出,则清除溢出标志位,等待主机重发。
void USART2_IRQHandler(void)
{
if(__HAL_UART_GET_FLAG(&uart_handler[1], UART_FLAG_ORE) != RESET)
{
__HAL_UART_CLEAR_OREFLAG(&uart_handler[1]);
}
HAL_UART_IRQHandler(&uart_handler[1]);
}