You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:06:25