【问题标题】:Best way to parse canbus data in arduino?在arduino中解析canbus数据的最佳方法?
【发布时间】:2019-07-15 14:32:24
【问题描述】:

我有带有 arduino ide 的 esp32 连接到 canbus。我从 rx_frame.data.u8[] 获取数据流,它有 8 个字节,例如。 [FF、FF、FF、61、3F、FF、FF、FF];

我需要 rx_frame.data.u8[3] 和 rx_frame.data.u8[4] 例如。 61 和 3F,让它们以 intel 字节顺序(反转字节顺序?)例如。 3F61 并转换为 DEC。它应该返回 16255。

问题:我无法将 rx_frame.data.u8[] 转换为 intel 字节顺序,然后转换为 DEC。我尝试了几件事,我能够使用 String engspd1 = String(rx_frame.data.u8[4], HEX) + String(rx_frame.data.u8[3], HEX);但现在我无法将 String engspd1 转换为 DEC。 另外我会解析大量数据,所以我不确定哪种方式最适合解析这种数据流。

附:抱歉,如果我通过不同的命名方式在我的问题中犯了一些错误。我刚从 C、C++ 和 arduino ide 开始。

#include <CAN_config.h>


CAN_device_t CAN_cfg;

void setup() {
    Serial.begin(115200);
    Serial.println("iotsharing.com CAN demo");
    CAN_cfg.speed=CAN_SPEED_250KBPS;
    CAN_cfg.tx_pin_id = GPIO_NUM_5;
    CAN_cfg.rx_pin_id = GPIO_NUM_4;
    CAN_cfg.rx_queue = xQueueCreate(10,sizeof(CAN_frame_t));
    //start CAN Module
    ESP32Can.CANInit();
}

void loop() {
    CAN_frame_t rx_frame;
    //receive next CAN frame from queue
    if(xQueueReceive(CAN_cfg.rx_queue,&rx_frame, 3*portTICK_PERIOD_MS)==pdTRUE){

      //do stuff!

        if(rx_frame.MsgID == 217056256) {
        String engspd1 = String(rx_frame.data.u8[4], HEX) + String(rx_frame.data.u8[3], HEX);
        int engspd2 = engspd1.toInt(); // throws error of course
        Serial.println(engspd1);
        Serial.println(engspd2);
      } 

【问题讨论】:

  • 没有必要把事情搞得这么复杂。转换为更大的类型后,只需将高位字节左移 8 位,然后按位或与低位字节一起移动。
  • 这听起来像是我需要的东西,你有时间展示示例代码吗?
  • 我会做类似unsigned engspd2 = (unsigned) rx_frame.data.u8[4] &lt;&lt; 8 | rx_frame.data.u8[3];的事情。
  • Bitshift 效果很好,我认为它没有使用太多资源,非常感谢您提供的精彩示例!

标签: c++ c parsing arduino


【解决方案1】:

在您的代码中,您访问的是字节 5 和 4,而不是 3 和 4。这是您的问题吗? C 数组是零索引的,因此 3 和 4 是您想要的字节的位置。

【讨论】:

  • 抱歉我的错误。但这不是问题。
  • 问题是我无法有效地解析数组中的 2 个字节。首先,我将字节 [3] 字节 [4] 的顺序更改为字节 [4] 字节 [3]。第二我需要得到字节[4]字节[3]的DEC值
  • 您尝试过@Thomas Jager 的建议吗?假设 engspd2 在启动时为零(因为按位或)并且长度为 16 位,这应该可以工作。
【解决方案2】:

你可以简单地添加你的字节来获得你想要的结果。 (您的数组不是十六进制的,因为这只是控制器一无所知的表示。

int engspd2 = rx_frame.data.u8[4] << 8 + rx_frame.data.u8[3];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2010-11-16
    • 2018-01-17
    • 1970-01-01
    相关资源
    最近更新 更多