La documentation de SerialPort
Write
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
?
Par défaut, SerialPort utilise ASCIIEncoding pour coder les caractères.
Vous confondez les méthodes qui lisent/écrivent string
s ou char
s avec les méthodes qui lisent/écrivent bytes
.
Par exemple, quand vous appellerez ceci:
port.Write("абв")
tu auras "???" (0x3F
0x3F
0x3F
) 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 0xE0
0xE1
0xE2
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.
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.