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

ESP-IDF下如何用printf以十进制而非十六进制打印CAN总线消息?

解决ESP32-S3 TWAI/CAN总线消息ID十进制打印问题

问题出在你直接打印了message.identifier字段——这个字段是包含ID、帧类型(标准/扩展)、RTR等标志位的打包值,并非纯ID数值。你看到的291是包含标志位后的整体数值,而非你发送的十进制ID 123。

正确处理步骤:

  1. 从message.identifier中提取纯ID部分,需根据帧类型使用对应掩码:
    • 标准帧(11位ID):用TWAI_STD_ID_MASK提取低11位
    • 扩展帧(29位ID):用TWAI_EXT_ID_MASK提取低29位
  2. 使用匹配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:07:25