关于c#:将RTU模式传感器数据转换为ASCII模式


Convert RTU Mode sensor data to ASCII mode

我正在开发用于C_中Modbus RTU模式(RS-485)传感器的Windows应用程序。

读取传感器数据时没有问题,但主要问题是当我尝试读取传感器版本时,结果显示在:

01041A4350532D524D2056312E303020323031383033323900000000007B00

但我需要证明结果是

CPS-RM V1.00 20180329

我在互联网上搜索这个,我想我应该转换成ASCII码,但我没有找到任何解决方案,你对此有什么想法。


看起来只有部分字符串是文本。我怀疑第三个字节是作为文本跟随的字节数(所以最后两个字节不是文本的一部分)。请注意,它用Unicode NUL字符(U+0000)填充,您可能需要对其进行修剪。

因此,如果您的数据位于名为bytes的变量中:

1
2
3
4
5
6
string text = Encoding.ASCII
    // Decode from the 4th byte, using the 3rd byte as the length
    .GetString(bytes, index: 3, count: bytes[2])
    // Trim any trailing U+0000 characters
    .TrimEnd('\0');
Console.WriteLine(text);

不过,我会提到这是基于猜测。我强烈建议您尝试找到数据格式的规范,以检查我关于使用第三个字节作为长度的假设。

如果您还没有将数据转换为字节(而不是十六进制),我建议您先将其转换为字节数组。在堆栈溢出上已经有很多代码可以做到这一点,例如这里和这里。


我找到了一个答案,它起作用了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 public static string ConvertHex(String hexString)
        {
            try
            {
                string ascii = string.Empty;
                for (int i = 0; i < hexString.Length; i += 2)
                {
                    String hs = string.Empty;

                    hs = hexString.Substring(i, 2);
                    uint decval = System.Convert.ToUInt32(hs, 16);
                    char character = System.Convert.ToChar(decval);
                    ascii += character;
                }
                return ascii;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return string.Empty;
        }