我正在编写一个C#应用程序,该应用程序将从3个不同的COM端口接收串行数据,并配置8位UART且无奇偶校验。其他设备将发送和接收二进制编码的HEX ex。 AF01h = 10101010 00000001每个字节有两个字符。我已经设置了虚拟COM端口和一个用于测试目的的简单应用程序,并且在我挂起设备之前来回发送数据。我发现数据在发送和接收时默认是ASCII编码的,但我需要两者都是二进制编码的HEX。我没有在编码类中看到该选项,并且宁愿不使用与其他3个设备完全不同的编码。现在我正在使用此代码在发送字符串时转换字符串
string binarystring = String.Join(String.Empty, hexstring.Select(c => Convert.ToString(Convert.ToInt32(c.ToString(), 16), 2).PadLeft(4, '0')));
sport.Write(binarystring);
txtReceive.AppendText("[" + dtn + "] " + "Sent: " + binarystring + "\n");
这适用于现在测试传输,但我最终会更改代码,将两位十六进制数直接放入字节数组中。
此代码允许我输入AF01h = 1010101000000001,但在应用程序的接收端,我得到16个字节的ASCII编码字符。有没有办法让我的应用程序与其他设备在同一页面上?
答案 0 :(得分:0)
想出办法。只需将长字符串十六进制转换为两个十六进制字符字节整数
string hex = txtDatatoSend.Text; //"F1AAAF1234BA01"
int numOfBytes = HEX.Length;
byte[] outbuffer = new byte[numOfBytes / 2];
for (int i = 0; i < numOfBytes; i += 2)
{
outbuffer[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
}
sport.Write(outbuffer, 0, outbuffer.Length);
sport.DiscardOutBuffer()
唯一需要注意的是你必须输入偶数个字符
另一方面,数据放回Byte [],我可以像这样解码。
byte[] inbuffer = new byte[sport.BytesToRead];
sport.Read(inbuffer, 0, inbuffer.Length);
txtReceive.AppendText("[" + dtn + "] " + "Received: " + inbuffer.Length + " bytes ");
for (int i = 0; i < inbuffer.Length; i++)
{
string hexValue = inbuffer[i].ToString("X2");
txtReceive.AppendText(inbuffer[i] + " is " + hexValue + "HEX ");
}
txtReceive.AppendText("\n");
sport.DiscardInBuffer();