SerialPort
Write
のドキュメントによると
デフォルトでは、SerialPortはASCIIEncodingを使用して文字をエンコードします。 ASCIIEncodingは、127より大きいすべての文字を(char)63または '?'としてエンコードします。その範囲内の追加の文字をサポートするには、EncodingをUTF8Encoding、UTF32Encoding、またはUnicodeEncodingに設定します。
ここ も参照してください。これは、write
を使用してバイト配列を送信できないことを意味しますか?
デフォルトでは、SerialPortはASCIIEncodingを使用して文字をエンコードします
string
sまたはchar
sを読み取り/書き込みするメソッドと、bytes
を読み取り/書き込みするメソッドを混同しています。
例:これを呼び出すとき:
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のラッパーであるストリームに直接書き込みます。
そして、はい、ドキュメントはあなたをだまします。
この
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);
同じバイトが送信されます。後者の場合、シリアルポートのエンコーディングは何でもかまいません。
シリアルポートのエンコーディングのみが重要です文字列を読み書きするメソッドの場合。