Files
VSC/Python3/Logger/Binary/imu_logger_binario_v1.py
T
claudio 368d6fafea Issue
Code backup
2026-05-10 16:59:01 +02:00

82 lines
2.2 KiB
Python

import serial
import struct
import csv
from datetime import datetime, timedelta
# ================= CONFIG =================
PORT = "COM3" # <-- cambia
BAUD = 921600
OUT_CSV = "imu_log.csv"
FRAME_FMT = "<H I 6h 6h H" # little-endian
FRAME_SIZE = struct.calcsize(FRAME_FMT)
MAGIC = 0xABCD
# ================= CRC ====================
def crc16_xor(data: bytes) -> int:
c = 0
for b in data:
c ^= b
return c & 0xFFFF
# ================= SERIAL =================
ser = serial.Serial(PORT, BAUD, timeout=1)
buffer = bytearray()
start_wall_time = None
start_ts_us = None
print("Listening...")
try:
with open(OUT_CSV, "w", newline="") as f:
writer = csv.writer(f)
writer.writerow([
"timestamp",
"imu1_ax","imu1_ay","imu1_az","imu1_gx","imu1_gy","imu1_gz",
"imu2_ax","imu2_ay","imu2_az","imu2_gx","imu2_gy","imu2_gz"
])
while True:
buffer += ser.read(1024)
while len(buffer) >= FRAME_SIZE:
# cerca MAGIC
if buffer[0] != 0xCD or buffer[1] != 0xAB:
buffer.pop(0)
continue
frame = buffer[:FRAME_SIZE]
buffer = buffer[FRAME_SIZE:]
# unpack
magic, ts_us, *imu, crc = struct.unpack(FRAME_FMT, frame)
# CRC check
if crc16_xor(frame[:-2]) != crc:
continue
# inizializza tempo base
if start_wall_time is None:
start_wall_time = datetime.now()
start_ts_us = ts_us
# timestamp assoluto coerente con ESP
delta_us = ts_us - start_ts_us
ts = start_wall_time + timedelta(microseconds=delta_us)
writer.writerow([
ts.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3],
*imu
])
# logging si può escludere
print(
ts.strftime("%H:%M:%S.%f")[:-3],
"| 1:", tuple(imu[:6]),
"| 2:", tuple(imu[6:])
)
except KeyboardInterrupt:
ser.close()
print("Stopped")