Files
485ChuanKou/test_check_cs.py
2026-01-22 10:30:38 +08:00

55 lines
1.9 KiB
Python

# 测试校验位计算
# 成功的合闸报文
success_command = "FE FE FE FE 68 08 00 09 10 24 20 68 1C 10 35 89 67 45 B7 72 38 9C 4F 33 8C 8C 56 55 34 59 9A 16"
# 失败的合闸报文(校验位错误)
fail_command = "FE FE FE FE 68 08 00 09 10 24 20 68 1C 10 35 89 67 45 B7 72 38 9C 4F 33 8C 8C 56 55 34 59 99 16"
def calculate_command_cs(command_str):
"""计算指令的CS校验位"""
try:
# 将指令拆分为列表
parts = command_str.split()
# 移除校验码和结束符(如果存在)
if len(parts) >= 2:
parts = parts[:-2]
# 重新组合为不带校验码和结束符的指令字符串
command_without_cs = " ".join(parts)
print(f"计算校验位的指令部分: {command_without_cs}")
# 转换为字节数组
command_bytes = bytes.fromhex(command_without_cs)
print(f"指令字节长度: {len(command_bytes)}")
# 计算校验和
cs = 0
for byte in command_bytes:
cs ^= byte
print(f"XOR进行中: 0x{cs:02X}")
# 转换为2位十六进制字符串
cs_hex = f"{cs:02X}"
print(f"最终校验位: {cs_hex}")
return cs_hex
except Exception as e:
print(f"CS校验位计算错误: {e}")
return "00"
# 测试成功报文的校验位
print("=== 测试成功报文的校验位 ===")
success_cs = calculate_command_cs(success_command)
print(f"成功报文的校验位: {success_cs}")
print("\n" + "="*50 + "\n")
# 测试失败报文的校验位
print("=== 测试失败报文的校验位 ===")
fail_cs = calculate_command_cs(fail_command)
print(f"失败报文的校验位: {fail_cs}")
print(f"失败报文原校验位: 99")
print(f"正确的校验位应该是: {fail_cs}")
# 生成正确的失败报文
fail_parts = fail_command.split()
fail_parts[-2] = fail_cs
correct_fail_command = " ".join(fail_parts)
print(f"\n正确的报文: {correct_fail_command}")