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

PIC32向UART缓冲区发送整数异常排查及正确实现咨询

PIC32 UART发送十六进制值异常的排查与解决

问题核心分析

从测试结果能明确:

  • 变量test的值确实是0xA3(逻辑分析仪、LED验证、sprintf转字符串输出均确认)
  • 但直接写入U1TXREG发送时,所有高位为0xA/0xF的十六进制值(如0xA3、0xA0、0xFF)都被输出为0x3F,仅0x03正常。这说明UART的配置存在错误,导致发送的8位数据被截断或篡改。

最可能的原因:UART数据位/奇偶校验配置错误

PIC32的UART当前配置大概率被设为7位数据位+奇偶校验模式:

  • 7位数据位会截断8位数据的最高位(0xA3的最高位是1,截断后剩下0x23)
  • 若同时开启奇偶校验,硬件会自动调整数据位以满足校验规则,最终输出不符合预期的0x3F(ASCII问号,通常是UART无法识别非法数据时的默认输出)

解决步骤

  1. 修正UART1的配置寄存器,强制设置为8位数据、无奇偶校验、1位停止位的标准串口模式:

    // 配置UART1数据格式:8位数据,无奇偶校验,1位停止位
    U1MODEbits.PDSEL = 0;    // PDSEL[1:0] = 00 → 8位数据,无校验
    U1MODEbits.STSEL = 0;    // STSEL = 0 → 1位停止位
    // 确保UART发送使能
    U1STAbits.UTXEN = 1;
    // 确保UART模块使能
    U1MODEbits.UARTEN = 1;
    
  2. 重新测试直接发送固定值:

    U1TXREG = 0xA3;
    Delayms(1);
    U1TXREG = 0xA0;
    Delayms(1);
    U1TXREG = 0x03;
    Delayms(1);
    U1TXREG = 0xFF;
    

    此时终端应输出A3 A0 03 FF(十六进制模式下)。

  3. 验证SPI读取后的数据发送:
    恢复SPI读取代码,直接发送test变量:

    csLow();
    spiWrite(0xFF);
    csHigh();
    Delayms(10);
    char test = SPI1BUF;
    U1TXREG = test;
    

    终端应正确显示A3(十六进制模式)。

补充说明

  • sprintf转字符串输出正常,是因为转换后的字符串是ASCII字符(如"A"和"3"对应的ASCII值是0x41和0x33),这些值的最高位为0,在7位数据位模式下也能正常传输,所以不会被篡改。
  • 若问题仍存在,可检查UART的波特率配置是否与终端一致,以及是否有其他代码在修改UART寄存器。

内容的提问来源于stack exchange,提问作者SomeBodyElse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:54:53