SavvyCANの画面ではCAN FDの12バイトが見えているのに、CSVを開くと8バイトしかない。そんなときは、保存形式を確認してみてください。
今回使用した対応版SavvyCANでは、GVRET Logs で保存すると、長さは 12 と記録される一方、データ列は D1〜D8 まででした。同じ受信データを Generic ID/Data CSV で保存し直すと、12バイトすべてを取り出せました。
この記事では、保存形式の選び方と、保存した100件のデータを照合する方法を紹介します。
確認した環境
- SavvyCAN:V221_JPWORKS_V100
- PC:Apple SiliconのMac mini、macOS 26.6.2
- CANインターフェース:pico-slcan、LAWICEL / SLCAN接続
- 送信側:Raspberry PiのCANインターフェース
rcan2 - 通信設定:CAN FD、BRSあり、公称500 kbit/s、データ2 Mbit/s
- 確認したフレーム:標準ID
0x212、データ長12バイト、データ00 01 02 03 04 05 06 07 08 09 0A 0B、100件
筆者はpico-slcanと、このSavvyCAN対応版の開発に関係しています。
まず受信画面と保存したCSVを比べる
SavvyCANの受信一覧で対象フレームを確認します。Expand All Rows を使うと、今回の画面では12バイトすべてを表示できました。
ところが File → Save Log File から GVRET Logs を選んで保存したファイルは、次のようになりました。
Time Stamp,ID,Extended,Dir,Bus,LEN,D1,D2,D3,D4,D5,D6,D7,D8
2314000,00000212,false,Rx,3,12,00,01,02,03,04,05,06,07,
LEN は12ですが、データは 00〜07 の8バイトまでです。このファイルだけから残りの4バイトを復元することはできません。
Generic ID/Data CSVで保存する
受信済みのフレームがSavvyCANの画面に残っている状態で、次の操作をします。
-
File → Save Log Fileを開く。 - 保存形式に Generic ID/Data CSV を選ぶ。
- ファイル名を指定して保存する。
- 保存したCSVを開き、対象IDのデータを確認する。
同じ100件を、受信データが残っているSavvyCANから保存し直したところ、次の形式になりました。
ID,Data Bytes
00000212,00 01 02 03 04 05 06 07 08 09 0A 0B
Data Bytes の中に、スペース区切りで12バイトが入っています。GVRETのCSVを変換したのではなく、SavvyCANに残っていた受信データを別形式で保存しています。
100件すべてを照合する
受信したのが上記のIDとデータだけの場合、Python 3で次のように照合できます。保存したファイル名を received.csv として実行します。
import csv
expected_id = 0x212
expected_data = bytes(range(12))
expected_count = 100
with open("received.csv", encoding="utf-8-sig", newline="") as f:
rows = list(csv.DictReader(f))
errors = []
for line_no, row in enumerate(rows, start=2):
try:
frame_id = int(row["ID"].strip(), 16)
data = bytes.fromhex(row["Data Bytes"])
except (KeyError, ValueError, TypeError) as exc:
errors.append(f"{line_no}行目: 読み取りエラー: {exc}")
continue
if frame_id != expected_id or data != expected_data:
errors.append(f"{line_no}行目: IDまたはデータが不一致")
if len(rows) != expected_count:
errors.append(f"件数: {len(rows)}件(期待値 {expected_count}件)")
if errors:
print("不一致:")
print("\n".join(errors))
raise SystemExit(1)
print(f"{len(rows)}件すべてのID・12バイトが一致")
100件すべてのID・12バイトが一致
この例は、同じID・データを100件送ったときの照合です。異なるフレームが混在する場合は、対象行を選ぶか、送信したデータの一覧と突き合わせてください。同じデータの繰り返しなので、これだけで個々の送信との対応や順序は判定できません。
保存形式で残る情報が違う
今回の Generic ID/Data CSV は、IDとデータの照合には使えますが、時刻・受信バス・送受信方向・FD/BRSフラグは残りません。時系列やバスの識別も必要な場合は、目的に合う保存方法を別途確認してください。
また、この結果は上記の対応版と12バイトのフレームで確認したものです。ほかの版やデータ長では、保存後のファイルを確認してください。
関連情報
- 対応版SavvyCANのリリース
- pico-slcanでPCに最初のCAN FDフレームを表示する — 接続から受信まで