# 测试校验位计算 # 成功的合闸报文 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}")