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

C# 将RTU模式传感器数据转换为ASCII模式,c#,C#,我正在尝试为C#中的Modbus RTU模式(RS-485)传感器开发Windows应用程序 读取传感器数据时没有问题,但主要问题是当我尝试读取传感器版本时,结果显示在: 01041A4350532D524D2056312E30302032303138303332390000000000007000 但我需要证明结果是这样的 CPS-RM V1.00 20180329 我在互联网上搜索过这个,我想我应该转换成ascii码,但我没有找到任何解决方案。你对此有什么想法。看起来字符串中只有一部分是文本

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

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

01041A4350532D524D2056312E30302032303138303332390000000000007000

但我需要证明结果是这样的

CPS-RM V1.00 20180329


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

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

因此,如果您的数据位于一个名为
字节
的变量中:

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);
我想说的是,这是基于猜测。我强烈建议您尝试寻找数据格式的规范,以检查我关于使用第三个字节作为长度的假设


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

我找到了一个答案,它成功了

 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;
        }
publicstaticstringconvertHex(stringhexstring)
{
尝试
{
字符串ascii=string.Empty;
for(int i=0;i
您是否已经将该数据作为字节数组,或者实际上是以字符串形式开始的?是否可以发布用于打印结果的代码?事实上,它看起来像是你打印了一个十六进制ASCII值字符串。我在这里找到了一个答案,你在昨天的评论中说,你已经将数据作为字节,而不仅仅是十六进制。这就是为什么我的答案中没有包含任何十六进制转换。我建议您将“将十六进制转换为二进制”和“使用二进制数据提取字符串”分离为不同的操作。(并避免出现重复的字符串连接,以及只报告错误并继续执行的异常处理。)@DaisyShipton抱歉,这是我的错。我在回答有关十六进制解析的其他问题时添加了参考。请注意,这里的代码的开头和结尾都会有额外的伪字符,它们不是字符串“CPS-RM V1.00 20180329”的一部分-这就是为什么我的答案从特定点开始,只解码特定的数据块。