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无法识别非法数据时的默认输出)
解决步骤
修正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;重新测试直接发送固定值:
U1TXREG = 0xA3; Delayms(1); U1TXREG = 0xA0; Delayms(1); U1TXREG = 0x03; Delayms(1); U1TXREG = 0xFF;此时终端应输出
A3 A0 03 FF(十六进制模式下)。验证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
相关产品推荐
相关产品推荐

