【python-can】CANを定期的に送信する!!

皆さん、お疲れ様です。本記事はCAN通信を理解しようとする記事の2回目です。前回の記事でpython-canでCAN通信をシミュレーションを出来るようにしました。

んで、今回はCANを定期送信するコードを書いてみようと思います。なんとなーく将来的に定期送信したり、イベントがあったら送信したり、っていう感じでユニットの動作を模擬できるようなコードを書いてみたいなぁっていうのがやりたい感じです。

んで、今回はとりあえず、定期送信してみようと思います。

やりたいこと

送信側)1secごとに定期送信する

受信側)受信したら受信値を書き出す

404 Not Found | Read the Docs

↑が参考資料です。英語が出来ないってのは辛いですね。

では始めます。

スポンサーリンク

送信側)1secごとに定期送信する

送信側のコードを以下に示します。

import can
import time

#バス接続
bus = can.interface.Bus(bustype='vector', channel=0, bitrate=500000, app_name='python-can')

#送信データ
msg = can.Message(arbitration_id = 0x001, data= [0,0,0,0,0,0,0,0], is_extended_id = False)

#送信
task = bus.send_periodic(msg, 1)
assert isinstance(task, can.CyclicSendTaskABC)

time.sleep(10)
task.stop()
print("stopped cyclic send")

bus.send_periodicで定期送信をしています。bus.send_periodic(送信メッセージ, 周期[sec])で指定しています。上のコードでは1sec周期ですね。

次のassert isinstanceはようわからんですが、、、たぶん、定期送信の内容がおかしかったら怒る様にしている文じゃないのかなぁ。。。

10sec間送信し続けて、task.stop()で定期送信を止めています。

受信側)受信したら受信値を書き出す

受信側のコードを以下に示します。

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 :
	recv_msg = bus.recv(timeout=1)
	if recv_msg != None:
		print('Recv msg : %s' % recv_msg)

print("end")

start_timeで開始時の時間を記録しておいて、15sec間はwhile文を実行します。bus.recvで接続BUSを受信して、受信値が空じゃなかったら書き出します。

実行してみる

↓こんな感じでプロンプトを2つ開いて、受信側のプログラム(can_resv.py)(受信はrecvだろ!)と送信側のプログラム(can_send.py)を実行してみます。

実行結果↓

受信側のtimestampを見ると大体1secごとに送信できていることが分かります。

ようわからんこと

timestampを見ると1回目と2回目が何故か2回メッセージが送信されています。んー何で?

その後は1secずつ送られてます。。。

BUSMasterでもっかい見てみても、初回に2回メッセージが送信されてます↓。今回は2回目の送信は1度だけですね。送信側がおかしいことはわかりましたが、原因が分かりませんでした。

んーわからないです。解決したら修正します。

とりあえず定期送信して受信できることが確認できたので、今日のところは良しとします。

はい。終わります。誰かの参考になれば幸いです。最後までお読みいただきありがとうございました!