Benutzer mit den meisten Antworten
Daten Über Serielle Schnittstelle Empfangen geht schief

Frage
-
Hallo zusammen,
ich habe das folgende Problem. Ich empfange auf der Seriellen Schnittstelle Daten die ich weiter verarbeiten will.
Das geht auch die ersten 300 Datensätze gut (so ca.) Danach geht das ein oder andere Byte flöten. Die Daten die empfangen werden sind folgender Massen aufgebaut:
<NachrichtenTyp;zah;zahl>
Leider fehlen dann Zeichen im NachrichtenTyp, die Semikolons oder die Zahlen. Nicht unbedingt die ganzen "Felder" sondern nur Teile (Kommen sollte <DATEN;10;333> und <DAN;133> kommt an) Habe mich auch schon mal mit dem HyperTerminal auf die Serielle gehängt, da kommt alles Sauber an, auch noch nach Stunden...
An bei mein Code der die Daten von der Seriellen Entgegen nimmt.
Vielen Dank schon mal für eure Hilfe.
Dim RXByte As Byte Dim ResivedString As String Private Sub Receiver(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles COMPort.DataReceived Try RXByte = COMPort.ReadByte Do RXByte = COMPort.ReadByte Dim s As String = Chr(RXByte) If s.Equals("<") Then ResivedString = "" ResivedString = s Else ResivedString += s End If If s.Equals(">") Then Me.BeginInvoke(New StringSubPointer(AddressOf Display), "Empfange: " & ResivedString & " |Ende") oneCommand(ResivedString) ResivedString = "" End If Loop Until (COMPort.BytesToRead = 0) Catch ex As Exception Dim errortxt As String = "Fehler in Sub Receiver " & ex.Message & vbCrLf Me.BeginInvoke(New StringSubPointer(AddressOf Display), errortxt) End Try End Sub
Antworten
-
Hallo El_loro,
Du liest beim Start der Routine ein Byte ein; und machst damit nichts weiter. Der Wert der Variable RXByte wird gleich in der nächste Zeile überschrieben.
Ich tippe mal, das ist das vermisste Zeichen. Lass das erste einlesen einfach weg.
Try
Do
RXByte = COMPort.ReadByte
Dim s As String = Chr(RXByte)
Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de- Als Antwort vorgeschlagen Robert Breitenhofer Montag, 8. Februar 2010 12:28
- Als Antwort markiert Robert Breitenhofer Mittwoch, 10. Februar 2010 16:12
-
Hallo EL_loro,
Schau Dir die folgende Diskussion an. Vielleicht findest Du etwas dass Dir weiter helfen kann.
Artikeln zum Lesen:
SerialPort.ReadExisting-Methode à http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.readexisting.aspx
SerialPort.ReadLine-Methode à http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.readline.aspx
SerialPort.ReadByte-Methode à http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.readbyte.aspx
SerialPort-Methoden à http://msdn.microsoft.com/de-de/library/system.io.ports.serialport_methods.aspx
Grüße,
Robert
- Als Antwort vorgeschlagen Robert Breitenhofer Montag, 8. Februar 2010 12:28
- Als Antwort markiert Robert Breitenhofer Mittwoch, 10. Februar 2010 16:12
-
Hallo EL_loro,
ich habe mich auch schon intensiv mit der seriellen Schnittstelle befasst.
Also der Code, den Robert hier vorstellt, funktioniert bei mir seit einem
halben Jahr ausgezeichnet. Ich hätte nicht gedacht, dass man das auf einem
Windows Rechner (mit Net Klassen nicht API!) stabil zum laufen bekommt. Viele Fachleute sagen, dazu bräuchte man ein Echtzeitbetriebssystem.
Ich habe in Deinem Code noch einen Mangel gefunden.
Loop Until (COMPort.BytesToRead = 0)
Die Tatsache, dass der Empfangspuffer = 0 wird ist kein ausreichendes Kriterium die
Datenübertragung zu beenden.
bytesToRead = 0 ist ein normaler Zustand, der bei laufender serieller Kommunikation
jederzeit auftreten kann. Besonders bei einem Multitasking Betriebssystem.
Du musst mit Steuerzeichen arbeiten. STX/ETX, ACK/NACK, DC1/DC2 sind gängige Verfahren
zur Flussteuerung.
Oder einen 2ten Layer aufbauen in welchen die Nutzdaten gekapselt werden,
(heist auch Protokoll)
Die SerialPort hat jede Menge Funktionen zum Empfangen und Senden von bytes und strings.
Hat aber kein eigenes Übertragungsprotokoll. Das muss der Programmierer selber erstellen.
ich wünsche Dir gute Gelingen mit SerialPort
Gruß
Ellen- Als Antwort vorgeschlagen Robert Breitenhofer Montag, 8. Februar 2010 12:28
- Als Antwort markiert Robert Breitenhofer Mittwoch, 10. Februar 2010 16:12
Alle Antworten
-
Hallo El_loro,
Du liest beim Start der Routine ein Byte ein; und machst damit nichts weiter. Der Wert der Variable RXByte wird gleich in der nächste Zeile überschrieben.
Ich tippe mal, das ist das vermisste Zeichen. Lass das erste einlesen einfach weg.
Try
Do
RXByte = COMPort.ReadByte
Dim s As String = Chr(RXByte)
Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de- Als Antwort vorgeschlagen Robert Breitenhofer Montag, 8. Februar 2010 12:28
- Als Antwort markiert Robert Breitenhofer Mittwoch, 10. Februar 2010 16:12
-
Hallo EL_loro,
Schau Dir die folgende Diskussion an. Vielleicht findest Du etwas dass Dir weiter helfen kann.
Artikeln zum Lesen:
SerialPort.ReadExisting-Methode à http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.readexisting.aspx
SerialPort.ReadLine-Methode à http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.readline.aspx
SerialPort.ReadByte-Methode à http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.readbyte.aspx
SerialPort-Methoden à http://msdn.microsoft.com/de-de/library/system.io.ports.serialport_methods.aspx
Grüße,
Robert
- Als Antwort vorgeschlagen Robert Breitenhofer Montag, 8. Februar 2010 12:28
- Als Antwort markiert Robert Breitenhofer Mittwoch, 10. Februar 2010 16:12
-
Hallo EL_loro,
ich habe mich auch schon intensiv mit der seriellen Schnittstelle befasst.
Also der Code, den Robert hier vorstellt, funktioniert bei mir seit einem
halben Jahr ausgezeichnet. Ich hätte nicht gedacht, dass man das auf einem
Windows Rechner (mit Net Klassen nicht API!) stabil zum laufen bekommt. Viele Fachleute sagen, dazu bräuchte man ein Echtzeitbetriebssystem.
Ich habe in Deinem Code noch einen Mangel gefunden.
Loop Until (COMPort.BytesToRead = 0)
Die Tatsache, dass der Empfangspuffer = 0 wird ist kein ausreichendes Kriterium die
Datenübertragung zu beenden.
bytesToRead = 0 ist ein normaler Zustand, der bei laufender serieller Kommunikation
jederzeit auftreten kann. Besonders bei einem Multitasking Betriebssystem.
Du musst mit Steuerzeichen arbeiten. STX/ETX, ACK/NACK, DC1/DC2 sind gängige Verfahren
zur Flussteuerung.
Oder einen 2ten Layer aufbauen in welchen die Nutzdaten gekapselt werden,
(heist auch Protokoll)
Die SerialPort hat jede Menge Funktionen zum Empfangen und Senden von bytes und strings.
Hat aber kein eigenes Übertragungsprotokoll. Das muss der Programmierer selber erstellen.
ich wünsche Dir gute Gelingen mit SerialPort
Gruß
Ellen- Als Antwort vorgeschlagen Robert Breitenhofer Montag, 8. Februar 2010 12:28
- Als Antwort markiert Robert Breitenhofer Mittwoch, 10. Februar 2010 16:12
-
Hallo zusammen,
Hier noch ein interessanter Artikel für Serielle Schnittstellen diesmal mithilfe von Platform Invocation Services (P/Invoke).
http://msdn.microsoft.com/en-us/magazine/cc301786.aspx
Grüße und Erfolg,
Robert
-
Servus zusammen,
vielen Dank für die Tipps, auch wenn ich mich erst verspätet melde. Mein Fehler war das ich zwei mal hintereinander auf der Seriellen gelesen habe ohen was zu machen...
Es ist halt nicht immer gut wenn man Sachen zwei mal liest :-)
Und noch mal vielen Dank für die InfosGruß Loro