Gestire la corretta codifica ASCII su porta seriale

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 

Print | posted on lunedì 22 ottobre 2007 23.49

Feedback

No comments posted yet.

Your comment:





 
Please add 2 and 6 and type the answer here:

Copyright © Alberto De Luca

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski