hiro yamamoto works

マイコンハード、ソフトを作ったりしています。
お家や現場のお困りごと解決に!
内容利用は自己責任でお願いします。

Arduino UNO MINIMAでCAN通信(4byteデータを2つ送るには)

2025-02-27 10:38:14 | CAN通信

CAN通信の活用方法を考えています。
今回テーマは「4byteデータを2つ送るには」です。
2byteを4つ送るとか応用もできます。

備忘記なんですが、参考に紹介します。

Arduino UNO R4 MINIMA CANWrite.inoサンプルスケッチの改変部分

static uint32_t value1 = 0;//millis()を入れてみます
static uint32_t value2 = 0;//サンプルスケッチのmsg_cntを入れてみます
//中略
value1 = millis();
// uint8_t const msg_data[] = {0xCA,0xFE,0,0,0,0,0,0};//オリジナル
  uint8_t const msg_data[] = {0,0,0,0,0,0,0,0};
  memcpy((void *)(msg_data), &value1, sizeof(value1));
  memcpy((void *)(msg_data + 4), &msg_cnt, sizeof(msg_cnt));//オリジナルそのまま使う
  CanMsg const msg(CanStandardId(CAN_ID), sizeof(msg_data), msg_data);
//中略



ESP32 TWAIreceive.inoスケッチの改変部分ほか

//中略
    //4byteデータ、2個の数値が送られてくる
    uint32_t value1 = 0;
    uint32_t value2 = 0;
    while (twai_receive(&message, 0) == ESP_OK) {
        Serial.printf("\nID: %lx\n", message.identifier);//改行してID:xx 表示して改行
        //"\n"は改行 書式指定文字 %lx 倍精度整数?を16進で出力する
        if (!(message.rtr)) {//リモートフレームじゃないとき
          //for (int i = 0; i < message.data_length_code; i++) {
          for (int i = 0; i <= 7; i++) {
            if (i <= 3) {
              value1 |= (uint32_t)( message.data[i] << (8 * i));
            } else if (i >= 4) {
              value2 |= (uint32_t)( message.data[i] << (8 * (i - 4)));
            }
            Serial.printf(" %d = %02x,", i, message.data[i]);
          }
          Serial.printf("\nvalue1:%lu", value1);//\nは改行(ニューライン)
          Serial.printf("\nvalue2:%lu\n\n", value2);
        }
        }//if (!(message.rtr))
}//while
//中略

CAN通信活用備忘記 続く



最新の画像もっと見る

コメントを投稿