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

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

ただいまの
回答率

87.59%

【Arduino】CAN.sendMsgBuf()の戻り値について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,284

score 46

ArduinoでCAN通信を送信する時に使用するCAN.sendMsgBuf()関数について質問です。
この関数は戻り値が3通りあります。
"CAN_OK"(0)  成功した
"CAN_SENDMSGTIMEOUT"(6) タイムアウトした
"CAN_GETTXBFTIMEOUT"(7) 次の空きバッファを取得できなかった

下記プログラムでは変数aに"CAN_OK"が代入することができません。
"CAN_SENDMSGTIMEOUT"や"CAN_GETTXBFTIMEOUT"でもCAN信号は送信できていました。
またCANモジュール(MCP2515)からジャンパを引き抜いた時に"CAN_OK"を代入されました。

そもそもネットやサンプルスケッチを見てもCAN.sendMsgBuf()関数で戻り値を変数に代入しているコードが見つからず、"CAN_SENDMSGTIMEOUT"や"CAN_GETTXBFTIMEOUT"を何故取得したのかもわかりません。

CAN.sendMsgBuf()関数で"CAN_OK"が取得できないにも関わらず、CAN信号が送信できる理由を教えてください。
また"CAN_SENDMSGTIMEOUT"や"CAN_GETTXBFTIMEOUT"を取得した時の問題点も教えてください。

ソースコード

#include <SPI.h>
#include "mcp_can.h"

MCP_CAN CAN0(9);

void setup()
{
    Serial.begin(38400);

    while (1)
    {
        if (CAN_OK == CAN0.begin(CAN_500KBPS))
        {
            break;
        }
    }
}

void loop()
{
    unsigned char buf[8] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 };
    int a = 0;
    for (unsigned long i = 0; i < 10; i++)
    {
        a = CAN0.sendMsgBuf((0x100 + i), 0, 8, buf);
        Serial.println(a);
    }
    delay(10);
}

シリアルモニタ

7
7
7
6
6
6
6
6
6
6
6
6
6
.
.
.

参考URL

https://github.com/Seeed-Studio/CAN_BUS_Shield

https://www.dfrobot.com/wiki/index.php/CAN-BUS_Shield_V2_(SKU:_DFR0370)

原因

終端抵抗が接続できてないことが原因でした。
以前使用していた時にはケーブルに終端抵抗があったため、通信できていたと思われます

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

Alynさん、

Arduinoで、CANだと、MCP2515のシールドで、このあたり(https://github.com/Seeed-Studio/CAN_BUS_Shield/)のコードを使ってるんじゃないかと思います。

https://github.com/Seeed-Studio/CAN_BUS_Shield/blob/master/mcp_can.cpp#L1165 のあたりの、MCP_CAN::sendMsg()を見ると、
return CAN_GETTXBFTIMEOUT;に引っかからなければ(=送信バッファの取得ができれば)、mcp2515_write_canMsg()が実行されるので、CANBUSにメッセージの送信が行われます。

その後、使用した送信バッファの制御レジスタTXBxCTRL(x=0,1,2)を読み出して、0x08でマスク(res1 = res1 & 0x08;)してるので、TXREQフラグをみて、送信完了(ビットが0になる)をチェックしてます。
#define TIMEOUTVALUE    50と定義されているので、
50回の試行、10msのインターバル(delayMicroseconds(10);)なので、500msec以内にフラグがクリアされなければ、return CAN_SENDMSGTIMEOUT;となってます。

MCP2515のデータシートにレジスタマップとか、説明があります。

またCANモジュール(MCP2515)からジャンパを引き抜いた時に"CAN_OK"を代入されました。

どのボードのどのジャンパか、わかりませんが、120Ωの終端抵抗でしょうか? オシロでとった波形がみれると、なにかわかるかもしれません.

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

CANというのは送信元があり、受信先があって初めて成立する通信プロトコルです。
もしかして送信元だけで、データを受信するデバイスがないんじゃないでしょうか。
そうすると、エラーしか帰りませんね

CAN.sendMsgBuf()関数で"CAN_OK"が取得できないにも関わらず、CAN信号が送信できる理由を教えてください。

送信したものの、受信先からの正常受信のレスポンスが来ないために、エラーを出しているものと思われます

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/23 00:05

    Arduino同士で通信を行っています。受信側ではif(CAN_OK == CAN0.readMsgBuf(&len, buf)){}という形で受信しています。

    キャンセル

  • 2019/02/23 00:10

    質門を編集し、そこら辺の事情と受信側のコードも提示しましょう

    キャンセル

  • 2019/02/23 00:14

    ああ、delayをループの中に入れたらどーなるでしょうか

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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