SerialPort
Write
的文档说明了
默认情况下,SerialPort使用ASCIIEncoding对字符进行编码。 ASCIIEncoding将所有大于127的字符编码为(char)63或 '&#39 ;.要支持该范围内的其他字符,请将“编码”设置为 UTF8Encoding,UTF32Encoding或UnicodeEncoding。
另见here。这是否意味着我无法使用write
发送字节数组?
答案 0 :(得分:4)
默认情况下,SerialPort使用ASCIIEncoding对字符进行编码
您使用读取/写入string
的方法读取/写入char
或bytes
s的方法令人困惑。
,例如,当你打电话给他时:
port.Write("абв")
你会得到" ???" (0x3F
0x3F
0x3F
)默认情况下在端口缓冲区中。另一方面,这个电话:
// this is equivalent of sending "абв" in Windows-1251 encoding
port.Write(new byte[] { 0xE0, 0xE1, 0xE2 }, 0, 3)
将直接编写序列0xE0
0xE1
0xE2
,而不会将字节替换为0x3F
值。
<强> UPD 强>
让我们看看源代码:
public void Write(string text)
{
// preconditions checks are omitted
byte[] bytes = this.encoding.GetBytes(text);
this.internalSerialStream.Write(bytes, 0, bytes.Length, this.writeTimeout);
}
public void Write(byte[] buffer, int offset, int count)
{
// preconditions checks are omitted
this.internalSerialStream.Write(buffer, offset, count, this.writeTimeout);
}
你看到了区别吗?
接受string
的方法使用当前的端口编码将字符串转换为byte
数组。接受byte
数组的方法将其直接写入流,该流是本机API的包装。
是的,文档欺骗了你。
答案 1 :(得分:1)
此
port.Encoding = System.Text.Encoding.UTF8;
string testStr = "TEST";
port.Write(testStr);
和这个
byte[] buf = System.Text.Encoding.UTF8.GetBytes(testStr);
port.Write(buf, 0, buf.Length);
将导致传输相同的字节。在后一种情况下,串行端口的编码可以是任何东西。
串口编码仅对读取或写入字符串的方法很重要。。