C# 使用特定格式将字节数组发送到串行端口

C# 使用特定格式将字节数组发送到串行端口,c#,serial-port,byte,C#,Serial Port,Byte,这里有点奇怪,但我正在尝试为一个监视器编写一个控制程序,它使用一个串行RS232端口来接收十六进制,0xFF,表示法,即0x00的命令 我遇到的问题是,我似乎找不到一种方法来获取用户输入,这是一个像55这样的十进制值,并将其转换成字节,十六进制,以及上述格式的形式。使用VisualStudio内置的Convert方法可以为我提供所需的正确值,但在开始时没有所需的0x 我对在C#中使用字节和字节数组还不熟悉,所以如果我错过了一个简单的格式化方法,请原谅我 下面是我在这里找到的一个字符串到字节的数组

这里有点奇怪,但我正在尝试为一个监视器编写一个控制程序,它使用一个串行RS232端口来接收十六进制,0xFF,表示法,即0x00的命令

我遇到的问题是,我似乎找不到一种方法来获取用户输入,这是一个像55这样的十进制值,并将其转换成字节,十六进制,以及上述格式的形式。使用VisualStudio内置的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;
        }
私有静态字节[]StringToByteArray(字符串十六进制)
{
int numbercars=十六进制长度;
字节[]字节=新字节[numbercars/2];
对于(int i=0;i
参见以下内容:

            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);

您可能只想将十六进制字符串转换为字节。看

简单转换一个“十六进制字符串字节”并发送字节:

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);
}
公共静态字节[]StringToByteArray(字符串十六进制)
{
int numbercars=十六进制长度;
字节[]字节=新字节[numbercars/2];
对于(int i=0;i
code将十六进制字符串(不带前缀0x)转换为其编码的字节值。如果希望它支持“0x55”之类的字符串,则需要在开头添加
If(hex.StartsWith(“0x”,StringComparison.OrdinalIgnoreCase)){hex=hex.Substring(2);}
,这将删除前缀(如果extisting),以便现有代码可以处理hexstring。感谢您的帮助,您知道如何将完整的0x55转换为{0x55}字节吗?这就是主要问题所在。字节数组应类似于{0xA6,0x01,0x00..}。不能将
0x
添加到字节,只能添加到二进制数据可能表示为十六进制数据的字符串中,例如
$“0x{bytes[0]}0x{bytes[1]}0x{bytes[2]}
。监视器是否需要
0xA6
作为十六进制格式的字符串或字节?您可以假定0x位于字节前面,但这只是为了二进制数据的可读性。如果在调试器会话的监视窗口中单击鼠标右键,则可以启用十六进制显示,然后在字节变量前面也会看到0x…监视器要求字节的格式为0xA6,我测试了它,仅发送A6,01,00。。。。。而且它不承认这个命令。为什么我不知道。这是我用来测试显示器控制的代码,它起作用了。字节[]temp2={0xA6,0x01,0x00,0x00,0x04,0x01,0xC0,0x50,0x32};MonPort.Write(temp2,0,temp2.Length);我需要的字节是十六进制格式,而不是字符串,看看我上面的评论,我的意思是我刚刚转换回一个字符串,所以你可以看到结果。你可以发送数据。