将RTU模式传感器数据转换为ASCII模式

时间:2018-06-05 06:29:35

标签: c#

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

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

  

01041A4350532D524D2056312E303020323031383033323900000000007B00

但我需要显示结果就像

  

CPS-RM V1.00 20180329

我在互联网上搜索过这个我认为我应该转换为ascii代码,但我找不到任何解决方案你对此有任何想法。

2 个答案:

答案 0 :(得分:1)

看起来只有部分字符串实际上是文本。我怀疑第三个字节是要作为文本后面的文本处理的字节数(因此最后两个字节不是文本的一部分)。请注意,它是用您可能想要修剪的Unicode NUL字符(U + 0000)填充的。

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

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);

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

如果还没有已经将数据作为字节获取(而不是以十六进制表示),我建议您先将其转换为字节数组。 Stack Overflow上有批次的代码片段已经完成,例如herehere

答案 1 :(得分:0)

我找到了答案并且有效

 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;
        }