web-dev-qa-db-fra.com

Puis-je utiliser SerialPort.Write pour envoyer un tableau d'octets

La documentation de SerialPortWrite indique que

Par défaut, SerialPort utilise ASCIIEncoding pour coder les caractères. ASCIIEncoding encode tous les caractères supérieurs à 127 sous la forme (char) 63 ou '?'. Pour prendre en charge des caractères supplémentaires dans cette plage, définissez Encoding sur UTF8Encoding, UTF32Encoding ou UnicodeEncoding.

Voir aussi ici . Est-ce que cela signifie que je ne peux pas envoyer de tableau d'octets en utilisant write?

5
user5387678

Par défaut, SerialPort utilise ASCIIEncoding pour coder les caractères.

Vous confondez les méthodes qui lisent/écrivent strings ou chars avec les méthodes qui lisent/écrivent bytes.

Par exemple, quand vous appellerez ceci:

port.Write("абв")

tu auras "???" (0x3F0x3F0x3F) dans le tampon de port par défaut. Par contre, cet appel:

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

écrira la séquence 0xE00xE10xE2 directement, sans remplacer d'octets par la valeur 0x3F.

UPD.

Regardons dans le code source:

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

Voyez-vous la différence?
La méthode, qui accepte string, convertit les chaînes en un tableau byte, en utilisant le codage actuel pour le port. La méthode, qui accepte le tableau byte, l’écrit directement dans un flux enveloppant l’API native.

Et oui, la documentation vous trompe.

4
Dennis

Ce

port.Encoding = System.Text.Encoding.UTF8;

string testStr = "TEST";

port.Write(testStr);

et ça

byte[] buf = System.Text.Encoding.UTF8.GetBytes(testStr);

port.Write(buf, 0, buf.Length);

entraînera la transmission des mêmes octets. Dans ce dernier cas, le codage du port série peut être n'importe quoi. 

Le codage du port série ne compte que pour les méthodes qui lisent ou écrivent des chaînes.

1
dbasnett