webentwicklung-frage-antwort-db.com.de

Kann ich SerialPort.Write verwenden, um ein Byte-Array zu senden

Die Dokumentation von SerialPortWrite 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?

5
user5387678

Standardmäßig verwendet SerialPort die ASCIIEncoding-Methode zum Codieren der Zeichen

Sie verwirren Methoden, die strings oder chars lesen/schreiben, mit Methoden, die bytes lesen/schreiben.

Zum Beispiel, wenn Sie das nennen:

port.Write("абв")

du wirst kriegen "???" (0x3F0x3F0x3F) 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 0xE00xE10xE2 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.

4
Dennis

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 .

1
dbasnett