Codifica porta seriale in c#

mercoledì 25 maggio 2011 - 18.57
Tag Elenco Tags  C#  |  .NET 4.0  |  Windows 7  |  Visual Studio 2010

Luigi.23 Profilo | Newbie

Ciao a tutti,
sto cercando di interfacciarmi con uno scanner codici a barra collegato al pc con Windows 7 64bit tramite un convertitore usb seriale sulla porta COM4.
Ho provato prima a collegarmi tramite HyperTerminal, ho impostato i parametri, ho passato un codice a barra e su HyperTerminal è apparso il valore corretto del codice a barra.
Ho creato quindi un applicazione in C#, ho creato un oggetto di tipo SerialPort, impostato gli stessi parametri usati su HyperTerminal ma il codice a barra viene letto male.
Molti caratteri vengono visualizzati con un punto interrogativo! Probabilmente è un problema di codifica ma non so come risolverlo.
Il valore del codice a barra è 088698857236 ma viene visualizzata la stringa ?88??88?72??, questi sono i byte che il mio codice C# legge: 176 56 56 182 185 56 56 181 55 50 179 182
Qualche idea?

Brainkiller Profilo | Guru

>Molti caratteri vengono visualizzati con un punto interrogativo!
>Probabilmente è un problema di codifica ma non so come risolverlo.
>Il valore del codice a barra è 088698857236 ma viene visualizzata
>la stringa ?88??88?72??, questi sono i byte che il mio codice
>C# legge: 176 56 56 182 185 56 56 181 55 50 179 182
>Qualche idea?

Eh eh, si fa sempre un po' fatica con queste seriali.
Pare di sì che sia un problema di codifica ma è strano che alcuni vengano letti giusti e altri no.
In realtà per tutti i valori > 100 togliendo un 128 ottieni il valore giusto.
Quindi:

176 - 128 = 48 (che in codice ASCII corrisponde allo 0, proprio la prima cifra del tuo barre)

E così anche con gli altri.
Questo è una prima soluzione che può consentirti di risolvere il problema certo non è la migliore e forse te n'eri già accorto.

La classe SerialPort ha una proprietà Encoding, di default è ASCIIEncoding. Forse puoi provare ad agire lì.
Io personalmente non ho mai avuto problemi di questo tipo usando le seriali (solo una volta ma era colpa del cavo).
Ciao

David De Giacomi | <empty>
http://blogs.dotnethell.it/david/

Luigi.23 Profilo | Newbie

Si avevo già provato a modificare manualmente tutti i byte maggiori di 127 ed in effetti le stringhe così vengono codificate correttamente ma non mi piace per niente come soluzione
Ho già provato tutti i valori possibili per Encoding ma niente, la migliore è quella di default....
Ora ho provato ad impostare la proprietà DataBits dell'oggetto SerialPort a 7 anziché 8 e le stringhe vengono lette correttamente senza bisogno di nessuna modifica ma non è neanche questa la soluzione ottimale.
Infatti lo scanner può anche ricevere dei comandi, per esempio inviando il valore (in esadecimale) 0x45 riesco ad abilitare lo scanner mentre con 0x44 lo disabilito (valori che corrispondono rispettivamente alle lettere E e D, che fantasia ); impostando il DataBits a 8 funziona il comando 0x45 ma non il comando 0x44 mentre impostando il DataBits a 7 accade l'inverso...

Luigi.23 Profilo | Newbie

Forse ho risolto, controllando i valori dei byte restituiti e convertendoli in binario mi sono reso conto che i dati vengono inviati con un bit di parità dispari perciò è stato sufficiente impostare la proprietà Parity a Parity.Odd e il DataBits al valore 7, ora tutti i comandi vanno e i codici vengono letti correttamente senza il mio intervento.
Evidentemente questi parametri sono stati cambiati senza informarmi dato che di default sono impostati a 8 bit e senza bit di parità devo fare altre prove ma credo di essere sulla strada giusta, grazie mille dell'aiuto

Brainkiller Profilo | Guru

>dato che di default sono impostati a 8 bit e senza bit di parità
> devo fare altre prove ma credo di essere sulla strada giusta,
>grazie mille dell'aiuto

Si infatti la maggior parte dei problemi derivano da impostazioni errate, ma ti avevo visto sicuro sui parametri quindi non ho obbiettato.
Ciao

David De Giacomi | <empty>
http://blogs.dotnethell.it/david/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5