ESP-IDF下如何用printf以十进制而非十六进制打印CAN总线消息?
解决ESP32-S3 TWAI/CAN总线消息ID十进制打印问题
问题出在你直接打印了message.identifier字段——这个字段是包含ID、帧类型(标准/扩展)、RTR等标志位的打包值,并非纯ID数值。你看到的291是包含标志位后的整体数值,而非你发送的十进制ID 123。
正确处理步骤:
- 从
message.identifier中提取纯ID部分,需根据帧类型使用对应掩码:- 标准帧(11位ID):用
TWAI_STD_ID_MASK提取低11位 - 扩展帧(29位ID):用
TWAI_EXT_ID_MASK提取低29位
- 标准帧(11位ID):用
- 使用匹配
uint32_t类型的格式符打印提取后的ID
修改后的代码示例:
#include <inttypes.h> // 必须包含此头文件才能使用PRIu32 // 提取纯ID值 uint32_t can_id; if (message.identifier & TWAI_MSG_FLAG_EXTD) { // 扩展帧处理 can_id = message.identifier & TWAI_EXT_ID_MASK; } else { // 标准帧处理 can_id = message.identifier & TWAI_STD_ID_MASK; } // 十进制打印ID printf("ID is %" PRIu32 "\n", can_id); // 数据部分打印保持不变 if (!(message.rtr)) { for (int i = 0; i < message.data_length_code; i++) { printf("Data byte %d = %d\n", i, message.data[i]); } }
你之前尝试的%" PRIu32 "格式符本身是正确的,但问题在于没有先提取纯ID,直接打印了包含标志位的message.identifier,所以输出结果不符合预期。
内容的提问来源于stack exchange,提问作者eidetech
相关产品推荐
相关产品推荐

