Die Dokumentation von SerialPort
Write
sagt das
Standardmäßig verwendet SerialPort ASCIIEncoding zur Codierung der Zeichen. ASCIIEncoding codiert alle Zeichen, die größer als 127 sind, als (char) 63 oder '?'. Um zusätzliche Zeichen in diesem Bereich zu unterstützen, setzen Sie Encoding auf UTF8Encoding, UTF32Encoding oder UnicodeEncoding.
Siehe auch hier . Bedeutet das, dass ich kein Byte-Array mit write
senden kann?
Standardmäßig verwendet SerialPort die ASCIIEncoding-Methode zum Codieren der Zeichen
Sie verwirren Methoden, die string
s oder char
s lesen/schreiben, mit Methoden, die bytes
lesen/schreiben.
Zum Beispiel, wenn Sie das nennen:
port.Write("абв")
du wirst kriegen "???" (0x3F
0x3F
0x3F
) standardmäßig im Portpuffer. Auf der anderen Seite dieser Aufruf:
// this is equivalent of sending "абв" in Windows-1251 encoding
port.Write(new byte[] { 0xE0, 0xE1, 0xE2 }, 0, 3)
schreibt die Sequenz 0xE0
0xE1
0xE2
direkt, ohne Bytes in 0x3F
-Wert zu ersetzen.
UPD.
Schauen wir uns den Quellcode an:
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);
}
Siehst du den unterschied
Eine Methode, die string
akzeptiert, konvertiert Zeichenfolgen in ein byte
-Array, wobei die aktuelle Kodierung für Port verwendet wird. Diese Methode, die byte
akzeptiert, schreibt sie direkt in einen Stream, der die native API umgibt.
Und ja, Dokumentation täuscht dich.
Diese
port.Encoding = System.Text.Encoding.UTF8;
string testStr = "TEST";
port.Write(testStr);
und das
byte[] buf = System.Text.Encoding.UTF8.GetBytes(testStr);
port.Write(buf, 0, buf.Length);
führt dazu, dass die gleichen Bytes übertragen werden. Im letzteren Fall kann die Kodierung der seriellen Schnittstelle beliebig sein.
Die Codierung der seriellen Schnittstelle ist nur wichtig für Methoden, die Strings lesen oder schreiben .