質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

解決済

ArduinoでSerial通信(CAN通信)を行いたい

saki1214
saki1214

総合スコア34

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

1回答

0評価

0クリップ

305閲覧

投稿2022/04/09 07:17

前提

ArduinoでCAN通信を行いたい。

実現したいこと

2台のArduino UnoとCANバスモジュールをもちいて双方向の通信を行いたい。
https://qiita.com/covao/items/d30fa5e36470bbee3be7 
を参考にしました。

CAN0(一つ目のArduinoとCANバスモジュール)からByte列を送り、CAN1(2つ目のArduinoとCANバスモジュール)でそれをそのままオウム返しする。

↓のCANバスモジュールを2個使用しています。
https://www.amazon.co.jp/WINGONEER-MCP2515-CAN%E3%83%90%E3%82%B9%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%ABTJA1050%E3%83%AC%E3%82%B7%E3%83%BC%E3%83%90SPI%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%ABArduino%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A451-ARM-DIY%E3%81%AA%E3%81%A9/dp/B07F68GHBJ/ref=sr_1_6?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=MCP2515&qid=1649487861&sr=8-6

発生している問題・エラーメッセージ

下記のようなコードを書きましたが、往路CAN0→CAN1は送信受信できているが、復路CAN1→CAN0は復号?できない。

復路受け側でif (CAN0.checkReceive() == CAN_MSGAVAIL) {}はTrueになっていることをSerial.printで確認しているが
その内容は長さが0となっている。
受信できている往路受け側ではこの長さが8となっていることも確認済。

該当のソースコード

Arduino CAN0

// MCP2515 CAN Send and Receive #include <mcp_can.h> //https://github.com/coryjfowler/MCP_CAN_lib #include <SPI.h> unsigned long rxId; byte len; byte rxBuf[8]; byte txBuf0[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; byte txBuf1[] = {0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8}; long Pre_millis; MCP_CAN CAN0(10);// CAN0 CS: pin 10 MCP_CAN CAN1(9); // CAN1 CS: pin 9 void setup() { Serial.begin(115200); // init CAN0 bus, baudrate: 250kbps@8MHz if (CAN0.begin(MCP_ANY, CAN_250KBPS, MCP_8MHZ) == CAN_OK) { Serial.println("CAN0: Init OK!"); CAN0.setMode(MCP_NORMAL); } else { Serial.println("CAN0: Init Fail!"); } } int count = 0; void loop() { if (millis() - Pre_millis > 1000) { if (count++ % 2 == 0)CAN0.sendMsgBuf(0x100, 0, 8, txBuf0); else CAN0.sendMsgBuf(0x101, 0, 8, txBuf1); Serial.print("Send ID: "); Serial.println(count); Pre_millis = millis(); } if (CAN0.checkReceive() == CAN_MSGAVAIL) { CAN1.readMsgBuf(&rxId, &len, rxBuf); if (len > 0) { Serial.print("Length: "); Serial.print(len); Serial.print(" Recive ID: "); Serial.print(rxId, HEX); Serial.print(" Data: "); for (byte i = 0; i < len; i++) { Serial.print(rxBuf[i], HEX); Serial.print(" "); } Serial.println(); } } }

Arduino

// MCP2515 CAN Recieve and Return #include <mcp_can.h> //https://github.com/coryjfowler/MCP_CAN_lib #include <SPI.h> unsigned long rxId; byte len; byte rxBuf[8]; byte txBuf0[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; byte txBuf1[] = {0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8}; long Pre_millis; MCP_CAN CAN0(10);// CAN0 CS: pin 10 MCP_CAN CAN1(9); // CAN1 CS: pin 9 void setup() { Serial.begin(115200); // init CAN1 bus, baudrate: 250kbps@8MHz if (CAN1.begin(MCP_ANY, CAN_250KBPS, MCP_8MHZ) == CAN_OK) { Serial.println("CAN1: Init OK!"); CAN1.setMode(MCP_NORMAL); } else { Serial.println("CAN1: Init Fail!"); } } void loop() { static int count = 0; if (CAN1.checkReceive() == CAN_MSGAVAIL) { CAN1.readMsgBuf(&rxId, &len, rxBuf); Serial.print("Length: "); Serial.print(len); Serial.print(" Recive ID: "); Serial.print(rxId, HEX); Serial.print(" Data: "); for (byte i = 0; i < len; i++) { Serial.print(rxBuf[i], HEX); Serial.print(" "); } Serial.println(); //オウム返し送信 Serial.println("Send..."); CAN1.sendMsgBuf(0x100, 0, 8, rxBuf); } }

試したこと

Arduinoとモジュールの送受信を入れ替え

補足情報(FW/ツールのバージョンなど)

Arduino IDE 1.8.13
Widows 10

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。