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