2017-09-19 15 views

答えて

0

私はあなたが「ワンショット」によって何を意味するかわからないんだけど、私は、単一のCANを送るには、このように、can-utilsからcansendユーティリティを使用して、すべての時間枠:

$ cansend can0 135#02080426A10D112A 

私も書きましたCプログラムはAF_CANソケットを使用して同じ動作をします。 (基本的にはどのように把握するcansend.cからCRIBことができます。)

のメッセージの再送信に関しては、これはcansendでは発生しません:

$ timeout 20s tcpdump -i can0 -w out.pcap &                                    
[1] 16509 
tcpdump: listening on can0, link-type CAN_SOCKETCAN (CAN-bus with SocketCAN headers), capture size 262144 bytes 

$ cansend can0 135#02080426A10D112A 

$ 1 packet captured 
0 packets received by filter 
0 packets dropped by kernel 

[1] + 16509 exit 124 timeout 20s tcpdump -i can0 -w out.pcap 
上記のシーケンスで

、何の消費者がオンラインに存在しないので、誰もメッセージをACKするが、私はのままで、は、can0で1つのパケットしかキャプチャしない。 cansendが終了した後、SocketCANスタックがバックグラウンドでメッセージを自動的に再送信しようとしていないと結論付けるのは安全です。

+0

メッセージを読み取ってACKを返す受信者がいない場合、送信者は再試行を続けます。私はちょうどメッセージを送ろうと思っています。それを読む人がいなければ、それは失われますが、送付者は移動します。 – ilya1725

+0

私は 'cansend'がメッセージを再送しようとしないことに注意して答えを更新しました。私はCANでかなり仕事をしましたが、私は決して専門家ではないので、おそらく私はあなたの問題を誤解しました。あなたはあなたの目標を達成するために 'cansend'(' system() 'など)をすることはできませんか? – evadeflow

0

CANフレームは、バスエラーが検出されるまで(バスオフ)、何度も再送信されます。これはCANペリフェラルによって行われます(specの一部であり、 "再送信"を検索します)、SocketCanはそれについて何も知らない。

SocketCanでは、バス/コントローラ上で別のerror notificationsを購読することができます。一般に、CANペリフェラル/ドライバは、これらのエラーのサブセットのみのシグナリングを実装します。あなたが運が良ければ、通知のためにsubscribe (see 4.1.2)に対応し、それに応じて対応することができます。

関連する問題