【发布时间】:2020-01-08 09:33:45
【问题描述】:
这里有点奇怪,但我正在尝试为监视器编写一个控制程序,该监视器使用串行 RS232 端口接收十六进制、0xFF、符号即 0x00 的命令。
我遇到的问题是我似乎无法找到一种方法来获取用户输入,这是一个像 55 这样的十进制值,并将其转换为具有上述格式的字节、十六进制形式。使用 Visual Studio 内置的 Convert 方法可以得到我需要的正确值,但开头没有所需的 0x。
我不熟悉在 C# 中使用字节和字节数组,如果我错过了一个可以解决它的简单格式化方法,请原谅我。
下面是我在这里找到的字符串到字节数组的方法,它很有帮助,但给了我错误的字节格式。
private static byte[] StringToByteArray(String hex)
{
int NumberChars = hex.Length;
byte[] bytes = new byte[NumberChars / 2];
for (int i = 0; i < NumberChars; i += 2)
bytes[i / 2] = Convert.ToByte(hex.Substring(i+2, 2), 16);
return bytes;
}
【问题讨论】:
-
您的代码将十六进制字符串(不带前缀 0x)转换为其编码的字节值。如果您希望它支持“0x55”之类的字符串,则需要在开头添加
if (hex.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) { hex = hex.Substring(2); },这将删除前缀(如果存在),以便现有代码可以处理十六进制字符串。 -
感谢您的帮助,您知道如何将完整的 0x55 转换为 {0x55} 的字节吗?这就是主要问题所在。字节数组应类似于 {0xA6,0x01,0x00....}。
-
您不能将
0x添加到一个字节,只能添加到您的二进制数据可能表示为十六进制数据的字符串,例如$"0x{bytes[0]}0x{bytes[1]}0x{bytes[2]}"。监视器是否需要0xA6作为十六进制格式的字符串或字节?您可以假设 0x 位于字节前面,但这仅用于人类可读的二进制数据。如果您在调试器会话的监视窗口中单击鼠标右键,您可以启用 Hexadecimal Display 然后您将在字节变量前面看到 0x... -
显示器要求字节格式为 0xA6,我测试它只发送 A6,01,00..... 并且它没有识别命令。为什么我不知道。
-
这是我用来测试显示器控制的代码,它工作正常。字节[] temp2 = { 0xA6, 0x01, 0x00, 0x00, 0x00, 0x04, 0x01, 0xC0, 0x50, 0x32 }; MonPort.Write(temp2, 0, temp2.Length);
标签: c# serial-port byte