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]); 效果一致 } } }
关键说明
- 修正printf参数顺序:第一个参数必须是格式字符串,第二个才是要打印的变量
pBuffer[0] %02x中的02确保输出固定两位,补0对齐;%#自动添加十六进制前缀,让输出格式更直观
内容的提问来源于stack exchange,提问作者bibo
相关产品推荐
相关产品推荐

