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

C语言中如何用printf以0xXX格式打印十六进制数字?

解决C语言中printf十六进制格式打印及SI5338寄存器读取乱码问题

你的代码出现乱码的核心原因是printf调用参数顺序错误,且未指定十六进制格式字符串。原代码中printf(pBuffer[0], "\r\n");会把寄存器值pBuffer[0]当作格式字符串解析,自然出现乱码。

要实现0x38、0x01这类带前缀的十六进制输出,需使用printf的十六进制格式控制符,常见用法如下:

  • %#x:自动添加0x前缀,输出小写十六进制数
  • %#X:自动添加0X前缀,输出大写十六进制数
  • %#02x:自动添加0x前缀,且固定输出两位(不足两位补0,避免出现0x1这类不整齐的结果)

修改后的完整代码

static void ReadReg_SI5338(uint8_t *pBuffer)
{
    uint8_t ret;
    ret = HAL_I2C_Master_Transmit(&hi2c2, SI5338_ADDR, pBuffer, 1, 5);
    if ( ret != HAL_OK )
    {
        printf("Error Tx\r\n");
    }
    else
    {
        ret = HAL_I2C_Master_Receive(&hi2c2, SI5338_ADDR, pBuffer, 1, 5);
        if ( ret != HAL_OK )
        {
            printf("Error Rx\r\n");
        }
        else
        {
            // 打印带0x前缀的两位十六进制寄存器值
            printf("%#02x\r\n", pBuffer[0]);
            // 也可以手动指定前缀:printf("0x%02x\r\n", pBuffer[0]); 效果一致
        }
    }
}

关键说明

  1. 修正printf参数顺序:第一个参数必须是格式字符串,第二个才是要打印的变量pBuffer[0]
  2. %02x中的02确保输出固定两位,补0对齐;%#自动添加十六进制前缀,让输出格式更直观

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:05:55