バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
XCP BasicのメモリアクセスでDAQの実験が残っていた。
DAQを動作させるにはそれなりの手順が有り、以下のコマンドを投げる必要がある。
- FREE_DAQ
- ALLOC_DAQ
- ALLOC_ODT
- ALLOC_ODT_ENTRY
- SET_DAQ_PTR
- WRITE_DAQ
- SET_DAQ_LIST_MODE
- START_STOP
- START_STOP_SYNCH
とりあえず順番に一個ずつ投げていくことに。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
XCPパケット送受信を関数化
じゃー、まずは順番にやっていくってことで、
FREE_DAQから投げていくかー。
ちょい待ち!
な、なに?
前回までのXCPパケットの投げ方だと手順が冗長になるから、
ここらで一旦関数化してしまおう。
確かにだいたい投げ方は一緒だもんね。
加えて、DAQが動作し始めるとこちらのコマンドに対してのレスポンス以外に
DAQパケットが混じってくるから、そこもちゃんとレスポンスパケットと認識する形で受信するようにしておこう。
具体的にはどんな感じにするの?
一応、私の方でざっと組んでみた。
resid = 2
def xcp_sendrecv(data):
send_msg = can.Message(arbitration_id=1, extended_id=0, data=data)
print('Send msg : %s' % send_msg)
bus.send( send_msg )
start = time.time()
while True:
recv_msg = bus.recv(timeout=1)
if recv_msg != None:
if resid == recv_msg.arbitration_id:
if (0xFC <= recv_msg.data[0] ) & ( recv_msg.data[0] <= 0xFF):
break
if time.time() > start + 1:
break
print('Recv msg : %s' % recv_msg)
return recv_msg
xcp_sendrecv([0xFF, 0x00, ]);
Send msg : Timestamp: 0.000000 ID: 0001 S DLC: 2 ff 00
Recv msg : Timestamp: 1635382190.793615 ID: 0002 S DLC: 8 ff 04 80 08 08 00 01 01 Channel: 1
XCP Basicのコンソール画面
-> CONNECT mode=0
ほう。
xcp_sendrecvって名前の関数なのね。
xcp_sendrecv関数解説
CAN送信はいままでと一緒だね。
CAN受信側がwhile文とif文が一杯増えてる感じだけど、
これは何をしてるの?
まず、応答が無かった時のためにタイムアウト機能を入れてる。
if time.time() > start + 1:
で判定してて、とりあえず1秒以上応答が無かったらタイムアウトだ。
そして受信パケットのCANDIDが2と先頭のPIDが0xFEか0xFFであれば、
コマンドに対しての何かしらのレスポンスと認識する。
レスポンスPIDは
0xFFが正常応答で
0xFEがエラー応答だったね。
そうそう。
それ以外の場合はDAQパケットの可能性があるんで、
読み捨てる。
なるほど。
コマンドを送ってレスポンス待ちのタイミングで
たまたまDAQパケットが飛び込んで来たら、それがレスポンスと誤認する可能性があるのか。
それを回避するための判定ってことか。
正解だ。
次回からは、この関数を使ってバンバンパケットを投げまくる。
まとめ
まとめだよ。
- XCPパケット送受信処理を関数化してみた。
- CAN送信は従来通り。
- CAN受信でいろいろ判定を追加
- タイムアウト追加。
- 1秒タイムアウト。
- CANID判定追加
- PID判定追加。
- 0xFE(エラー)か0xFF(正常)以外はレスポンスとして扱わない。
- レスポンスのタイミングでDAQパケットが来ても無視できる。
- タイムアウト追加。
バックナンバーはこちら。
コメント