python-canを使用し、シミュレーション上でCANの送受信を行う。
完成イメージ
RequesterがID0x111のCANを送信し、Receiverがそれを受信後、ID0x222を返す。
また、それぞれが送受信するときにprintで出力する。
Receiver
receiver.py
import can
import time
#バス接続
bus = can.interface.Bus(
interface='vector',
channel=0,
bitrate=500000,
app_name='xlCANcontrol'
)
#受信
while True:
recv_msg = bus.recv(timeout=1)
if recv_msg != None:
print('Receiver: Recieve msg')
break
#送信
reader = can.io.ASCReader("receve.asc")
start_time = None
for msg in reader:
if msg.timestamp is not None:
if start_time is None:
start_time = msg.timestamp
t0 = time.time()
else:
sleep_time = (msg.timestamp - start_time) - (time.time() - t0)
if sleep_time > 0:
time.sleep(sleep_time)
bus.send(msg)
print('Receiver: Send msg')
bus.shutdown()
receive.asc
Begin Triggerblock
0.000000 Start of measurement
0.000000 1 222 Rx d 02 03 04
End TriggerBlock
Requester
Requester.py
import can
import time
#バス接続
bus = can.interface.Bus(
interface='vector',
channel=0,
bitrate=500000,
app_name='xlCANcontrol'
)
#送信
reader = can.io.ASCReader("request.asc")
start_time = None
for msg in reader:
if msg.timestamp is not None:
if start_time is None:
start_time = msg.timestamp
t0 = time.time()
else:
sleep_time = (msg.timestamp - start_time) - (time.time() - t0)
if sleep_time > 0:
time.sleep(sleep_time)
bus.send(msg)
print('Requester: Send msg')
#受信
recv_msg = bus.recv(timeout=1)
print('Requester: Receive msg')
bus.shutdown()
request.asc
Begin Triggerblock
0.000000 Start of measurement
0.000000 1 111 Rx d 02 03 04
End TriggerBlock
実行結果
receiver.py→requester.pyの順番で実施したそれぞれの結果が以下。
>python receiver.py
Receiver: Recieve msg
Receiver: Send msg
>python requester.py
Requester: Send msg
Requester: Receive msg
BUSMASTERでの測定結果
test.log
***BUSMASTER Ver 3.2.2***
***PROTOCOL CAN***
***NOTE: PLEASE DO NOT EDIT THIS DOCUMENT***
***[START LOGGING SESSION]***
***START DATE AND TIME 8:2:2026 21:29:27:442***
***HEX***
***SYSTEM MODE***
***START CHANNEL BAUD RATE***
***CHANNEL 1 - Vector - Virtual Channel 1 SN - 100 - 500000 bps***
***END CHANNEL BAUD RATE***
***START DATABASE FILES***
***END DATABASE FILES***
***<Time><Tx/Rx><Channel><CAN ID><Type><DLC><DataBytes>***
21:29:42:4984 Rx 1 0x111 s 2 03 04
21:29:42:5017 Rx 1 0x222 s 2 03 04
***END DATE AND TIME 8:2:2026 21:29:45:805***
***[STOP LOGGING SESSION]***