You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#串口通信校验和计算不符:结果与预期值差异求助

串口通信校验和计算问题

我正在开发一款与通信设备建立串口连接的应用,当前在实现校验和计算流程时遇到问题,无法得到预期值。测试代码如下:

public static void GetCheckSum()
{
    // test data1 
    // the desired checksum value(correct answer) : 61
    // This data gives 61
    // var hexInput = "43-33-30-30-20-20-20-20-20-20-20-32-03";

    // test data2
    // the desired checksum value(correct answer) : 42
    var hexInput = "54-33-30-30-20-20-20-20-38-2E-30-03";

    byte[] byteData = hexInput.Split("-").Select(hex => Convert.ToByte(hex)).ToArray();

    byte checkSumTest = new byte();

    for (int i = 0; i < byteData.Length; i++)
    {
        checkSumTest = (byte)(checkSumTest ^ byteData[i]);
    }

    Console.WriteLine(checkSumTest);
}

问题细节

  • 测试数据1的预期校验和为61,代码计算结果符合预期;
  • 测试数据2包含2E,使用Convert.ToByte(hex)时抛出System.FormatException: 'Input string was not in a correct format.'异常;
  • 修改为Convert.ToByte(hex, 16)后异常解决,但计算结果为66,与预期值42不符。

问题分析与解决

1. 解析异常的原因

Convert.ToByte(hex)默认按十进制解析字符串,2E不是合法的十进制数值,因此必须指定16进制解析规则(Convert.ToByte(hex,16)),这一步修改是正确的。

2. 校验和结果不符的核心排查

你当前得到的66是十进制值,对应十六进制42,这里大概率存在进制误解:设备文档中标注的预期值42可能是十六进制,而非十进制。如果是这种情况,你的代码计算结果完全正确。

如果设备确实预期十进制42(十六进制2A),则说明你使用的异或算法与设备协议不匹配,需要按以下方向排查:

  • 确认算法类型:串口设备常用的校验和算法包括异或、8位累加和(模256取余)、CRC8等,必须严格匹配设备协议定义;
  • 确认计算范围:部分设备会排除帧头、帧尾等特殊字节(比如测试数据中的03可能是结束符,不需要参与计算)。

3. 针对性修改示例

若设备使用8位累加和(模256)

public static void GetCheckSum()
{
    var hexInput = "54-33-30-30-20-20-20-20-38-2E-30-03";
    byte[] byteData = hexInput.Split("-").Select(hex => Convert.ToByte(hex, 16)).ToArray();

    int checkSumTest = 0;
    foreach (byte b in byteData)
    {
        checkSumTest += b;
    }
    // 取低8位作为校验和
    checkSumTest &= 0xFF;
    Console.WriteLine(checkSumTest);
}

若设备要求排除最后一个字节(结束符03)计算异或

public static void GetCheckSum()
{
    var hexInput = "54-33-30-30-20-20-20-20-38-2E-30-03";
    byte[] byteData = hexInput.Split("-").Select(hex => Convert.ToByte(hex, 16)).ToArray();

    byte checkSumTest = 0;
    // 仅计算前11个字节
    for (int i = 0; i < byteData.Length - 1; i++)
    {
        checkSumTest ^= byteData[i];
    }
    Console.WriteLine(checkSumTest);
}

关键建议

串口通信的校验和规则完全由设备协议决定,优先查阅设备的通信文档确认算法和计算范围。若无文档,可通过多组设备发送的数据包反推算法:对比数据差异与校验和差异,判断是异或还是累加和类型,再验证计算范围。

内容的提问来源于stack exchange,提问作者BTOM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:20:43