web-dev-qa-db-ja.com

SerialPort.Writeを使用してバイト配列を送信できますか

SerialPortWriteのドキュメントによると

デフォルトでは、SerialPortはASCIIEncodingを使用して文字をエンコードします。 ASCIIEncodingは、127より大きいすべての文字を(char)63または '?'としてエンコードします。その範囲内の追加の文字をサポートするには、EncodingをUTF8Encoding、UTF32Encoding、またはUnicodeEncodingに設定します。

ここ も参照してください。これは、writeを使用してバイト配列を送信できないことを意味しますか?

5
user5387678

デフォルトでは、SerialPortはASCIIEncodingを使用して文字をエンコードします

stringsまたはcharsを読み取り/書き込みするメソッドと、bytesを読み取り/書き込みするメソッドを混同しています。

例:これを呼び出すとき:

port.Write("абв")

あなたは「???」を取得します(0x3F0x3F0x3F)デフォルトでポートバッファにあります。一方、この呼び出し:

// this is equivalent of sending "абв" in Windows-1251 encoding
port.Write(new byte[] { 0xE0, 0xE1, 0xE2 }, 0, 3)

バイトを0xE0値に置き換えずに、シーケンス0xE10xE20x3Fを直接書き込みます。

[〜#〜] 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のラッパーであるストリームに直接書き込みます。

そして、はい、ドキュメントはあなたをだまします。

4
Dennis

この

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

同じバイトが送信されます。後者の場合、シリアルポートのエンコーディングは何でもかまいません。

シリアルポートのエンコーディングのみが重要です文字列を読み書きするメソッドの場合

1
dbasnett