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)填充,您可能需要对其进行修剪。
因此,如果您的数据位于名为
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; } |