乐此不疲 发表于 2025-12-10 11:57:07

请教AI8051U串口打印多了两位数据的问题

学习使用AI8051U硬件I2C总线应用时遇到串口打印数据有问题特来请教!先谢了!

使用的示例代码为试验箱的第28#例程,该例程中串口相关代码摘录如下:
// 串口初始化函数
void UartInit(void)
{
    P_SW1 &= ~S1_S1;      // UART1切换到P3.0/P3.1
    P_SW1 &= ~S1_S0;

    SCON = 0x50;          // 8位数据,可变波特率,允许接收
    AUXR |= (1<<6);       // 定时器1时钟1T模式
    AUXR &= ~S1BRT;       // 串口1选择定时器1为波特率发生器
    TL1 = TM;
    TH1 = TM >> 8;
    TR1 = 1;            // 定时器1开始计时
    TI = 0;               // 清除发送中断标志
    RI = 0;               // 清除接收中断标志

}

// 串口发送字符函数
void UartPutc(unsigned char dat)
{
    SBUF = dat;
    while(TI == 0);       // 等待发送完成
    TI = 0;               // 清除标志
}

// printf重定向
char putchar(char c)
{
    UartPutc(c);
    return c;
}我在主函数中有声明:u8 tus=0x18;
我在主循环中只加了两行代码如下:

printf("状态字:0x%02X\r\n", tus);
delay_ms(1000);

程序运行后在串口助手窗口看到的文本数据如下:接收←状态字:0x185E
问题:为什么打印数据不是0x18而是185E。

DebugLab 发表于 2025-12-10 13:30:01

改成0x%02bX试试
51编译器和251编译器不一样

乐此不疲 发表于 2025-12-10 19:33:51

DebugLab 发表于 2025-12-10 13:30
改成0x%02bX试试
51编译器和251编译器不一样

多谢你的指点,采用你给的打印格式真的可以实现0x18的打印输出,只是这个后加的“b”的含义我不明白,如果得空时希望能说一下,看到你的答案之前我发现如果打印变量定义为16位值u16 tus=0x18;可以得到正确的输出0x18,如果在打印输出中强制转换一下变量也可以输出正确答案:printf("状态字:0x%02X\r\n", (u16)tus);,最后再次感谢你的热心指点。

乘风飞扬 发表于 2025-12-11 09:06:00

乐此不疲 发表于 2025-12-10 19:33
多谢你的指点,采用你给的打印格式真的可以实现0x18的打印输出,只是这个后加的“b”的含义我不明白,如 ...

可参考这个帖子介绍:
printf函数 的 格式参数; USB接口 使用 printf 打印数据
https://www.stcaimcu.com/thread-6864-1-1.html
(出处: 国芯人工智能技术交流网站)

乐此不疲 发表于 2025-12-11 10:15:06

乘风飞扬 发表于 2025-12-11 09:06
可参考这个帖子介绍:
printf函数 的 格式参数; USB接口 使用 printf 打印数据
https://www.stcaimcu.co ...

多谢,这个帖子说的透彻,明白了,再谢!
页: [1]
查看完整版本: 请教AI8051U串口打印多了两位数据的问题