Oggi in Community (ovvero già da qualche giorno) un utente si lamentava della modifica da parte della porta seriale dei caratteri da lui inviati come terminatori di riga in un protocollo standard di comunicazione. Il problema stava nel fatto che la porta seriale utilizza un Encoding di default diverso dall'encoding di default di VS.NET, il primo utilizza un Encoding System.Text.ASCIIEncoding con tabella caratteri ASCII-US, il secondo invece utilizza un encoding di tipo System.Text.SBCSCodePageEncoding, che fa riferimento alla Tabella codici carattere impostata nelle impostazioni internazionali di Windows. Se io passo un codice carattere come il Chr(130) ai due encoding (Chr(130) fa parte dei caratteri estesi della codifica ASCII, quindi è personalizzato per ogni singola tabella caratteri standard) nel primo caso ottengo il carattere "?" nel secondo caso il carattere ",". L'utilizzo del Chr(130) con la codifica di default di VS.NET manda in palla il protocollo seriale. Per ovviare a questa anomalia dobbiamo codificare la stringa utilizzando l'Encoding corretto ovvero (nel nostro caso) quello di default della seriale.
In buona sostanza:
Dim outputString As String = "Hello serial port" + Chr(130)
Dim MySerial As New System.IO.Ports.SerialPort("COM1")
'Trasformo in Array di Byte la stringa utilizzando l'Encoding di Default '(è indifferente quale viene utilizzato)
Dim MyArray() As Byte = System.Text.Encoding.Default.GetBytes(outputString)
'Recupero su una variabile stringa l'Array di byte decodificato con l'encoding corretto
Dim StringaCorretta As String = MySerial.Encoding.GetString(MyArray)
'Scrivo sulla seriale...
MySerial.Open()
MySerial.Write(StringaCorretta)
MySerial.Close()
Saluti,
Alberto De Luca