PIC16F153 UART回显部分字节重复问题求助
PIC16 UART通信部分字节重复问题排查方案
问题描述
在PIC16上使用UART通信时,出现部分字节重复的现象。使用MPLAB的MCC生成UART相关驱动函数,采用18.432MHz外部振荡器,配置波特率115200,无波特率误差。
串口数据重复现象截图:
核心代码示例:
//Simple code sample: void main(void) { uint8_t data; SYSTEM_Initialize(); // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits // Use the following macros to: // Enable the Global Interrupts INTERRUPT_GlobalInterruptEnable(); // Enable the Peripheral Interrupts INTERRUPT_PeripheralInterruptEnable(); while (1) { if (EUSART2_is_rx_ready()) { data = EUSART2_Read(); EUSART2_Write(data); } } }
排查与解决思路
- 检查中断与标志位处理:
确认EUSART2的接收中断是否正确配置,虽然代码开启了全局和外设中断,但MCC默认可能未启用UART接收中断。另外,查看EUSART2_Read()函数的实现,确认它是否在读取后正确清除了接收完成标志位(如RCIF),若标志位未清除,会导致EUSART2_is_rx_ready()反复触发,重复读取同一字节。 - 硬件信号稳定性排查:
- 检查UART引脚(RX/TX)的布线,避免与高速数字信号、电源线路并行,减少电磁干扰;可在RX引脚对地添加100nF滤波电容。
- 确认串口通信线的连接可靠性,排查是否存在接触不良、地线断开等问题,信号失真可能导致接收端误判帧数据。
- 轮询逻辑优化:
当前轮询模式下,若EUSART2_Write()的耗时较长,可能导致新数据到来时未及时处理,但更可能的是EUSART2_is_rx_ready()的判断逻辑存在漏洞。可尝试在读取数据后,主动清除接收标志位,或者添加短延时再进入下一轮轮询。 - MCC配置复查:
- 重新核对UART配置:确认波特率发生器的分频系数、同步/异步模式选择正确,即便理论无误差,也需验证实际寄存器配置是否与预期一致。
- 若PIC16型号支持接收FIFO,检查FIFO是否启用,触发阈值是否合理,FIFO溢出或未正确清空可能导致数据重复。
- 确认奇偶校验、停止位、数据位长度与通信对端完全匹配,参数不匹配会引发帧错误,进而导致异常数据读取。
- 改用中断驱动方式:
轮询模式在系统有其他任务时容易出现响应不及时的问题,改用中断接收:在接收中断服务函数中读取数据并存入环形缓冲区,主循环从缓冲区取数据回发,避免因轮询间隙导致的重复读取或数据丢失。
内容的提问来源于stack exchange,提问作者Tom337324
相关产品推荐
相关产品推荐

