我正在尝试用C#开发用于Modbus RTU模式(RS-485)传感器的Windows应用程序。
在读取传感器数据时没有问题,但主要问题是当我尝试读取传感器的版本时,结果显示在:
01041A4350532D524D2056312E303020323031383033323900000000007B00
但我需要显示结果就像
CPS-RM V1.00 20180329
我在互联网上搜索过这个我认为我应该转换为ascii代码,但我找不到任何解决方案你对此有任何想法。
答案 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上有批次的代码片段已经完成,例如here和here。
答案 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;
}