皆さん、お疲れ様です。相変わらずCAN通信を勉強中のものです。CAN通信の送受信を模擬するシミュレーションをしてみて、CANを理解しようという記事の3回目です。
関連記事
0回目:「CAN通信って何?」という人向けにCAN通信の解説をしてみる
1回目:【Vector Virtual CAN BUS & Python-can】CAN通信のシミュレーション環境構築
2回目:【python-can】CANを定期的に送信する!!
3回目:【Python-can】受信したら返答するCANプログラム(本記事)
4回目:【python-can】ISO-TPの勉強!シミュレーションで動作確認するぞ!!
5回目:【python-can】ISO-TPのリクエストとレスポンスをシミュレーションするぞ!
今回は受信して、特定の信号が来たら返答を返す。というのをやってみたいと思います。
具体的には受信データの先頭データが1だったら返答する。っていう風に動作を記述してみようと思います。はい。誰かの何かの参考になれば幸いです。
コード
コードは以下の通りです。
受信側(can_recv.py)
受信データの先頭が1を受信したときはID=002で返答します。
import can
import time
#バス接続
bus = can.interface.Bus(bustype='vector', channel=0, bitrate=500000, app_name='python-can')
#受信
start_time = time.time()
while time.time() - start_time < 15 :#15sec間モニター
recv_msg = bus.recv(timeout=1)
if recv_msg != None:
if recv_msg.data[0] == 1:#data[0]が1のときは返答する。
#返答メッセージ生成
msg = can.Message(arbitration_id = 0x002,
data= [recv_msg.data[0],0,0,0,0,0,0,0],
is_extended_id = False)
bus.send(msg)
print("end")
送信側(can_send.py)
ID=001で送信します。1秒ごとに先頭データを0 ,1と交互に送信します。
import can
import time
#バス接続
bus = can.interface.Bus(bustype='vector', channel=0, bitrate=500000, app_name='python-can')
#送信
data_0 = 0
for i in range(10):
#先頭データ(data_0)を0,1を交互に送信する。
if data_0 == 0:
data_0 = 1
elif data_0 == 1:
data_0 = 0
msg = can.Message(arbitration_id = 0x001,
data= [data_0,0,0,0,0,0,0,0],
is_extended_id = False)
bus.send(msg)
time.sleep(1)#1sec毎に送信
print("stopped cyclic send")
動作確認
BUSMasterで確認した結果が以下の通りです。
ちゃんと1を受信したときだけ返答しているので、OKです。
今日は以上です。最後までお読みいただきありがとうございました!