import serial import struct import time # ========== CRC16 预计算查找表 ========== crc_tab = [] for i in range(256): crc = 0 c = i for _ in range(8): if (crc ^ c) & 1: crc = (crc >> 1) ^ 0xA001 else: crc >>= 1 c >>= 1 crc_tab.append(crc) def crc16(data): """CRC16-Modbus 校验 (查表法)""" crc = 0xFFFF for b in data: crc = (crc >> 8) ^ crc_tab[(crc ^ b) & 0xFF] return crc # ========== 帧格式常量 (新协议 48 字节) ========== # 0 2B 帧头 0xAA 0x55 # 2 4B 时间戳 uint32_t (ms, 自启动) # 6 12B 滤波后 Gyro[3] (float32 × 3) # 18 12B 滤波后 Accel[3] (float32 × 3) # 30 16B 四元数 qw, qx, qy, qz (float32 × 4) # 46 2B CRC16 (对前 46 字节) HEADER = b'\xAA\x55' HEADER_LEN = 2 PAYLOAD_LEN = 44 # uint32 + 3f + 3f + 4f = 4+12+12+16 CRC_LEN = 2 FRAME_LEN = HEADER_LEN + PAYLOAD_LEN + CRC_LEN # = 48 FIELD_NAMES = ['timestamp_ms', 'gyro_x', 'gyro_y', 'gyro_z', 'accel_x', 'accel_y', 'accel_z', 'qw', 'qx', 'qy', 'qz'] def parse_frame(payload_bytes): """解包 44 字节 payload Returns: dict with keys: timestamp_ms, gyro (3-tuple), accel (3-tuple), quat (4-tuple: qw,qx,qy,qz) """ ts, gx, gy, gz, ax, ay, az, qw, qx, qy, qz = struct.unpack(' 1 else 'COM3' baud = int(sys.argv[2]) if len(sys.argv) > 2 else 115200 main(port, baud)