RDSS/verify_file_order.py

134 lines
4.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/usr/bin/env python3
"""
验证bin文件和txt文件的信号顺序是否与debug文件一致
"""
import struct
import sys
sys.path.insert(0, 'd:\\DESIGN\\Git\\RDSS')
from core.encoder import BitFieldEncoder
# 文件路径
base_name = "RC_20ev_D1100KUU_D2100KNN_D3100KEE"
bin_file = f"{base_name}.bin"
txt_file = f"{base_name}_v4.txt"
debug_file = f"{base_name}_debug.txt"
encoder = BitFieldEncoder()
print("=" * 80)
print("验证三个文件的信号顺序是否一致(组内逆序排列)")
print("=" * 80)
# 1. 读取bin文件中的信号数据
print("\n1. 读取bin文件...")
with open(bin_file, 'rb') as f:
# 跳过启动指令(48字节)和停止指令(48字节)
f.seek(96)
# 读取数据部分
data = f.read()
# 每8个字节一个信号
bin_signals = []
for i in range(0, len(data) - 2, 8): # 减去2字节CRC
if i + 8 <= len(data):
signal = struct.unpack('>Q', data[i:i+8])[0]
bin_signals.append(signal)
print(f" bin文件信号数: {len(bin_signals)}")
# 2. 读取txt文件中的信号数据
print("\n2. 读取txt文件...")
with open(txt_file, 'r') as f:
lines = f.readlines()
# 前96个字节是指令启动+停止)
# 从第97个字节开始是信号数据
txt_bytes = [int(line.strip()) for line in lines[96:]]
txt_signals = []
for i in range(0, len(txt_bytes), 8):
if i + 8 <= len(txt_bytes):
signal = 0
for j in range(8):
signal = (signal << 8) | txt_bytes[i + j]
txt_signals.append(signal)
print(f" txt文件信号数: {len(txt_signals)}")
# 3. 从debug文件提取信号前几个
print("\n3. 从debug文件提取信号...")
debug_signals = []
with open(debug_file, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if line and not line.startswith('#') and not line.startswith('-'):
parts = line.split('|')
if len(parts) >= 3:
hex_str = parts[2].strip()
if hex_str.startswith('0x'):
signal = int(hex_str, 16)
debug_signals.append(signal)
print(f" debug文件信号数: {len(debug_signals)}")
# 4. 比较三个文件的信号顺序
print("\n4. 比较信号顺序...")
print("-" * 80)
# 比较前16个信号2组
check_count = min(16, len(bin_signals), len(txt_signals), len(debug_signals))
print(f"\n{check_count}个信号对比:")
print(f"{'序号':<6} {'bin文件':<20} {'txt文件':<20} {'debug文件':<20} {'一致'}")
print("-" * 80)
all_match = True
for i in range(check_count):
bin_sig = bin_signals[i]
txt_sig = txt_signals[i]
debug_sig = debug_signals[i]
match = (bin_sig == txt_sig == debug_sig)
status = "" if match else ""
print(f"{i+1:<6} {bin_sig:016X} {txt_sig:016X} {debug_sig:016X} {status}")
if not match:
all_match = False
print("-" * 80)
# 5. 检查组内逆序排列
print("\n5. 检查组内逆序排列...")
print("-" * 80)
# 检查bin文件的组内顺序
print("\nbin文件组内顺序检查前3组")
for group_idx in range(3):
start_idx = group_idx * 8
end_idx = start_idx + 8
group_signals = bin_signals[start_idx:end_idx]
# 解码信号获取时间戳
timestamps = []
for sig in group_signals:
decoded = encoder.decode(sig)
timestamps.append(decoded['timestamp'])
print(f"{group_idx+1}组信号序号 {start_idx+1}-{end_idx}: 时间戳 = {timestamps}")
# 检查组内是否逆序(时间戳应该递减)
is_descending = all(timestamps[i] >= timestamps[i+1] for i in range(len(timestamps)-1))
if is_descending:
print(f" ✓ 组内逆序排列正确")
else:
print(f" ✗ 组内逆序排列不正确")
print("-" * 80)
# 总结
print("\n" + "=" * 80)
if all_match:
print("✅ 验证通过!三个文件的信号顺序完全一致")
else:
print("❌ 验证失败!三个文件的信号顺序不一致")
print("=" * 80)