【Python-can】受信したら返答するCANプログラム

皆さん、お疲れ様です。相変わらずCAN通信を勉強中のものです。CAN通信の送受信を模擬するシミュレーションをしてみて、CANを理解しようという記事の3回目です。

今回は受信して、特定の信号が来たら返答を返す。というのをやってみたいと思います。

具体的には受信データの先頭データが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です。

今日は以上です。最後までお読みいただきありがとうございました!