LabVIEWForum.de
Serieller Empfang mit Timeout - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Instrument IO & VISA (/Forum-Instrument-IO-VISA)
+---- Thema: Serieller Empfang mit Timeout (/Thread-Serieller-Empfang-mit-Timeout)



Serieller Empfang mit Timeout - marc10k - 04.11.2009 16:09

Hallo

Ich benutze z.Z das "Advanced Serial Read and Write" als Basis VI für den Empfang von seriellen Daten via RS232. Ca. alle 250 ms empfange ich ein Datenpaket mit 62 Byte. Da die Daten immer kommen und nicht mit dem VI synchron sind kann es passieren das ich die 62 Byte aus zwei Paketen empfange. Z.B.: 50 Byte aus dem ersten und 12 Byte aus dem nächsten Paket.
Dies ist natürlich nicht gewollt.
Gibt es nun die Möglichkeit ein Timeout zu erstellen was nach 200 ms nicht empfangens von Daten den Input Buffer löscht? Damit dann beim nächsten Paket alles wieder synchron ist.
Das angehängte Beispiel ist mit 8.5 geöffnet worden.

Gruß

Marcus


Serieller Empfang mit Timeout - Achim - 04.11.2009 16:21

Hast du nicht zufällig ein Start-/Ende-Zeichen? Guck doch mal auch, ob du nicht nur einlesen kannst, wenn "Bytes at port" = 62 ist!

Auch mit dem Löschen nach 200ms kannst du im ungünstigen Fall mehrere Pakete verpassen, bis es zufällig wieder mal komplett reinpasst!


Serieller Empfang mit Timeout - jg - 04.11.2009 16:21

Hmm, wenn dein Paket immer 62 Bytes groß ist, dann lies doch immer 62 Zeichen aus, notfalls halt mit größerem Time-Out.

Gruß, Jens


Serieller Empfang mit Timeout - Lucki - 04.11.2009 17:44

Für die Synchronisation gibt es im Wesentlichen 2 Möglichkeiten:
a) Der Sender, der die 62 Byte sendet, arbeite als Slave. D.h er sendet jedes Paket nur nach Aufforderung, und Du liest dann genau 62 Byte ein. Der Vorteil ist, daß der Slave dann jedes Byte von 0..255 senden darf.
b) Der Sender sendet frei ohne Aufforderung alle 250ms. Dann muß das Ende eines Paketes durch ein besonderes Byte, genannt "TermChar", markiert sein. Standard ist n = 0xA. Das hat aber eine gravierende Einschränkung zur Folge, denn TermChar darf natülich nicht im normalen Datenstrom vorkommen. Alle Zahlen müssen ASCII-Codiert übertragen werden, d.h für ein Zahlenbyte, z.B Dezimal "255", muß "FF" gesendet werden, also 2 ASCII-Zeichen.
Die Einstellung zu b) wäre: End Read on TermChar aktivieren, zu lesende Bytes größer als 62 (Voreinstellung 1000 kann gelassen werden), Timeout gößere als 250 (10000 kann gelassen werden)

Wenn Du aber b) nimmst und Dein Datenstrom keinen Termchar enthält und das auch nicht von Dir geändert werden aknn, dann ist guter Rat teuer

Edit
@Jens
Zitat:wenn dein Paket immer 62 Bytes groß ist, dann lies doch immer 62 Zeichen aus, notfalls halt mit größerem Time-Out.
Wie ich schon sagte, funktioniert das sicher nur im Slave-Modus. Ansonsten kann es passieren, daß man zu Beginn der Übertragun ab dem 23. byte in der Datenstom hineinhört und bis zum 22. Byte des nächsten Paketes liest. Das wiederholt sich dann auf immer und ewig.

Aber mit zuätzlicher Intelligenz ist die Synchronisierung machbar. Z.B immer nur 1 byte einlesen, Timeaout kleiner als die Pause zwischen den Datenpaketen einstellen, und wenn es zum Timeut kommt, das als Ende eines Datenpaketes erkennen.


Serieller Empfang mit Timeout - marc10k - 05.11.2009 08:40

Hallo

Ich habe ein Start (0x80) und ein Stoppzeichen (0xFF). Nach weiteren Informationen die ich jetzt zum Datenprotokoll erhalten habe, sollen diese nicht in den Daten auftauchen können. Das macht die Sache einfacher.
Die Idee mit dem einzelnen Byte empfangen und dann einen Timeout kleiner als die Pause finde ich gut. Ich würde die Daten in einer While Schleife schreiben und mit dem Fehlercode die Schleife beenden lassen. Bei richtigem Empfang Daten weitergeben sonst neu starten. Muss ich bei Gelegenheit mal testen.

Eine andere Idee:
In C würde ich alle empfangenen Zeichen in ein Ringbuffer schreiben und schauen ob Byte x = 0x80 und Byte x + 62 = 0xFF ist. Kann ich dies auch so in LV umsetzten?

Marcus


Serieller Empfang mit Timeout - jg - 05.11.2009 08:56

' schrieb:Eine andere Idee:
In C würde ich alle empfangenen Zeichen in ein Ringbuffer schreiben und schauen ob Byte x = 0x80 und Byte x + 62 = 0xFF ist. Kann ich dies auch so in LV umsetzten?
Klar geht das, dafür ist LV prädestiniert!

Rechtsklick auf den Rand einer Schleife -> Create -> Shift-Register, und schon hast du deinen Ringpuffer.

Hier mal das Bsp. erweitert, das Parsing des Strings darfst du selber probieren. Entsprechende Funktionen findest du in der String-Palette.

Lv85_img[attachment=22195]

Gruß, Jens


Serieller Empfang mit Timeout - Lucki - 05.11.2009 09:36

' schrieb:Ich habe ein Start (0x80) und ein Stoppzeichen (0xFF).
Nichts gegen neue Ideen. Aber wenn Du ein Stopzeichen hast, dann sind doch alle Synchonisationsprobleme sofort gelöst. In dem Beispielprogramm einfach TermChar = FF setzten, TermChar aktivieren und schon müßte alles wunderber funktionieren.