問題タブ [socketcan]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sockets - C - socketCAN のブロードキャスト マネージャでサイクリック メッセージを送信する
socketcan のブロードキャスト マネージャーを使用して、CAN バスにいくつかのメッセージを書き込んでいます。
このコードは正しく機能し、5 つのメッセージを 100 ミリ秒間隔で 1 回送信するだけですが、これは私が望むものではありません。5 つのメッセージ (frame[0] から frame[4] まで) を 1 回送信し、最後のフレーム (frame[4]) のみを常に 100ms の間隔で送信し続けます。したがって、bcm は以下を送信する必要があります。
iva2.tv_usec を 100000 に設定すると、最後のフレームだけを送信したいのに、すべてのフレームを送信し続けます。どうすればこれを行うことができますか? TX_COUNTEVT フラグを追加すると、カウントがゼロに達すると bcm が TX_EXPIRED メッセージを生成することを読みました。この TX_EXPIRED メッセージを処理し、必要に応じて bcm 送信を手動で変更できますか? 念のため、この TX_EXPIRED メッセージをどこでどのように処理できますか? 私の目的を達成するための別の簡単な方法はありますか?
can-bus - CAN バス上でアービトレーションを模倣することはできますか?
設定
1 つの CAN バスに 2 つのノードが接続されています。最初のノードは、いくつかのリアルタイム ハードウェアによって制御されるブラック ボックスです。2 番目のノードは、PEAK-USB CAN コントローラーが接続された Linux マシンです。
時折のフレーム損失に関連する問題を調査するために、CAN アービトレーション プロセスを模倣したいと考えています。そのために、CAN ビットレートを 125Kb/s に設定し、1ms の遅延でランダムな CAN フレームをフラッディングし、can-utils のcanbusloadでバス負荷を制御しています。また、実行中のCANエラーフレームと全体的な缶の統計を次のように監視します。candump can0,0~0,#ffffffff
ip -s -d link show can
問題
問題は、指定されたセットアップが、負荷が 99% のときに、衝突 (調停) が発生せず、またはその他の種類のエラー フレームが発生することなく、何時間も機能することです。遅延を減らしてバスの負荷を増やすと、 「ENOBUFS 105 No buffer space available」または「EAGAIN 11 Resource temporarywrite(2)
available」のいずれかで失敗します- 実際のエラーは、qlenパラメータを変更するか、デフォルトに設定するかによって異なります。
私が理解しているように、私がかけた負荷は十分でないか、または多すぎます。2 つのノードを調停に参加させる正しい方法は何でしょうか? CAN_ERR_LOSTARB
正常な結果は、定数 fromと0以外のcollsnscan/error.h
の値に対応する受信 CAN エラー フレームになります。
ソースコード
HW ノード (CAN ボードを搭載した Arduino Due)
Linux ノード
linux-kernel - IXXAT SocketCAN ドライバーを使用した Raspberry Pi カーネルのビルド
RPI3B+ で IXXAT USB-to-CAN v2デバイスを使用したいと考えています。問題はドライバーとカーネルにあります。RPI で動作するデバイスを作成できません。記事により、このセットアップは機能するはずです。
この記事では、 SocketCAN ドライバーをインストールする必要があると述べています。その README ファイルには、次のように記載されています。
ラズベリーパイのセクションには次のように書かれています:
そして、それは私をカーネルの構築に結びつけます。
質問:
- カーネルをビルドする際、どのステップで IXXAT SocketCAN ドライバーを含める必要がありますか?
- SocketCAN ドライバーからファイルをコピーして貼り付ける必要がある場所はどこですか?
- カーネル構成も変更する必要がありますか?
can-utilsもインストールしますが、適切な SocketCAN ドライバーがないと、対象の USB-to-CAN デバイスが動作しません。
コマンドdmesg
:
コマンドlsusb
:
linux - Linuxでdotnetコアソケットを使用してSocketCanにアクセスできますか?
Linux プラットフォームで dotnet コアを使用しており、CAN デバイスとの通信をセットアップしたいと考えています。SocketCan は Linux プラットフォームで利用できますが、dotnet コアの UnixDomainSocketEndPoint および Socket クラスを使用して SocketCan に直接アクセスする方法はありますか?
Linux (Debian9) 環境でこのテスト プログラムを使用して Socket のインスタンスを作成しようとすると、次のようになります。
出力は次のとおりです。
列挙型 AdressFamily、SocketType、および ProtocolType のどの値が SocketCan ソケットに一致しますか?
c - CAN_RAW ソケットから CAN メッセージ フィルタを削除するには?
SocketCAN の説明では、ソケットにいくつかのフィルターを追加することについて述べています。
ただし、同じソケットに複数のフィルターがある場合に特定のフィルターを削除する方法については何も述べていません。誰かが私のためにこれを推測/説明してもらえますか?
(このことはどこかに書き留められていますか、それとも SocketCAN に触れる前に、まず Linux ソケットで多くの一般的な経験を積む必要がありますか?)
linux - RAW CAN ソケットと Broadcast Manager CAN ソケットの違いとその使用方法は?
CAN プロトコルは初めてで、Linux の SocketCAN を介して利用しようとしています。ただし、利用可能な 2 つの異なる CAN ソケット、RAW とブロードキャスト マネージャー (BCM) に混乱しています。
ドキュメントには、BCM ソケットは個々の CAN フレームを送信するためのものではないと記載されています。直感的には、BCM はシングル マスターとマルチ スレーブの構成に向いていると思いますが、これはやや間違っているようです。
BCM の目的は何ですか? というか、機能面での違いは何ですか?Raw Sockets ではなく Broadcast Manager の使用を選択するのは、どのような状況ですか?