Binäre Daten mit SerialPort-Control empfangen

17/02/2008 - 12:09 von Nicolas Nickisch | Report spam
Ich versuche eine Kommunikation zwischen einem Messgeràt und einem
VB.NET-Porgramm zu basteln.

DIe Daten kommen vom Messgeràt in 16-Byte grossen Paketen.
Am Anfang steht in Byte1 und 2 die Werte 90dez und 165dez (5A und A5) als
eine Art Anfangsmarkierung.
Der Rest sind Daten

Im ersten Versuch habe ich ReadTimeout .-1 und ReceivedBytesThreshold = 16
sowie ReadBufferSize@96 eingestellt.
In der Datareceived-Routine wurde dann mit SerialPort1.Read(a,0,16) ein
Paket von 16 Bytes gelesen und verarbeitet.
Das klappt soweit korrekt.

Bisweilen hörte das Porgramm dann aber nach einigen Dutzend, manchmal
hunderten t Paketen auf und reagiert nicht mehr, d.h. es werden keine Bytes
mehr abgeholt, da wohl die dataReceived-Methode nicht mehr ausgelöst wird.
Der Empfangspuffer wird dann immer voller.
Das konnte ich feststellen, weil ich per Timer die SerialPort.BytesToRead
nachschaue.

Warum das so ist, habe ich nicht herausgefunden.

Daher habe ich meine Software geàndert und versuche jetzt mit
str=Serialport.Readexisting alle Bytes zu lesen.
Die landen aber nicht wie zuvor in einem Byte-Array, sondern in einer
Stringvariablen.

Die Umwandlung in ein Array passiert dann so:
a=System.Text.Encoding.UTF8.GetBytes(str)
Das erste Byte ist dann auch brav 90dez, das zweite aber 63dez, die weiteren
Bytes scheinen wieder zu stimmen

Ersetzt das Control irgendwie nicht lesbare Zeichen ? ANfangs dachte ich,
dieses Verhalten hàngt mit der EIgenschaft ParityReplace zusammen, aber eine
Änderung in diesem Feld hat kein veràndertes Verhalten herbeigeführt


Hat jemand eine Idee ?

Gruss Nico
 

Lesen sie die antworten

#1 Thorsten Doerfler
19/02/2008 - 12:45 | Warnen spam
Nicolas Nickisch schrieb:
Daher habe ich meine Software geàndert und versuche jetzt mit
str=Serialport.Readexisting alle Bytes zu lesen.
Die landen aber nicht wie zuvor in einem Byte-Array, sondern in einer
Stringvariablen.

Die Umwandlung in ein Array passiert dann so:
a=System.Text.Encoding.UTF8.GetBytes(str)
Das erste Byte ist dann auch brav 90dez, das zweite aber 63dez, die weiteren
Bytes scheinen wieder zu stimmen

Ersetzt das Control irgendwie nicht lesbare Zeichen ?



By default arbeitet SerialPort mit ASCIIEncoding. Das Encoding kann
über SerialPort.Encoding abgefragt werden. Dieses solltest Du dann
auch verwenden, wenn Du Zeichenfolgen von oder zu Bytes umwandeln
möchtest:

a=SerialPort.Encoding.GetBytes(str)

Thorsten Dörfler
Microsoft MVP Visual Basic

vb-hellfire visual basic faq | vb-hellfire - einfach anders
http://vb-faq.de/ | http://www.vb-hellfire.de/

Ähnliche fragen