0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SavvyCANでCAN FDの12バイトをCSVに保存する:8バイトで切れるときの確認方法

0
Posted at

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の画面に残っている状態で、次の操作をします。

  1. File → Save Log File を開く。
  2. 保存形式に Generic ID/Data CSV を選ぶ。
  3. ファイル名を指定して保存する。
  4. 保存した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バイトのフレームで確認したものです。ほかの版やデータ長では、保存後のファイルを確認してください。

関連情報

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?