134 lines
4.0 KiB
Python
134 lines
4.0 KiB
Python
|
|
#!/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)
|