【问题标题】:Sending a byte array to a serial port using certain formatting使用特定格式将字节数组发送到串行端口
【发布时间】: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


【解决方案1】:

您可能只想将十六进制字符串转换为字节。见How do you convert a byte array to a hexadecimal string, and vice versa?

单个“hex-string-byte”的简单转换并发送字节:

MonPort.Write(Convert.ToByte("A6"), 0,1);

将文本框的内容转换为二进制数组并发送:

public 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), 16);
  return bytes;
}


public void SendData()
{
    byte[] sendBytes = StringToByteArray(YourSendBytesTextbox.Text);
    MonPort.Write(sendBytes, 0, sendBytes.Length);
}

【讨论】:

    【解决方案2】:

    见下文:

                string input = "abcdefghijk";
                byte[] data = string.Join(",",input.AsEnumerable()
                    .Select(x => "0x" + ((byte)x).ToString("X2")))
                    .Select(x => (byte)x).ToArray();
                string str = Encoding.UTF8.GetString(data);
    

    【讨论】:

    • 我需要字节是十六进制格式而不是字符串,看看我上面的评论是什么意思
    • 我刚刚转换回字符串,以便您查看结果。你会发送数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    相关资源
    最近更新 更多