我可以使用SerialPort.Write发送字节数组

时间:2015-09-30 10:50:01

标签: c# serial-port

SerialPort Write的文档说明了

  

默认情况下,SerialPort使用ASCIIEncoding对字符进行编码。   ASCIIEncoding将所有大于127的字符编码为(char)63或   '&#39 ;.要支持该范围内的其他字符,请将“编码”设置为   UTF8Encoding,UTF32Encoding或UnicodeEncoding。

另见here。这是否意味着我无法使用write发送字节数组?

2 个答案:

答案 0 :(得分:4)

  

默认情况下,SerialPort使用ASCIIEncoding对字符进行编码

您使用读取/写入string的方法读取/写入charbytes 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);

将导致传输相同的字节。在后一种情况下,串行端口的编码可以是任何东西。

串口编码仅对读取或写入字符串的方法很重要。