INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Serieller Empfang mit Timeout



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

04.11.2009, 16:09
Beitrag #1

marc10k Offline
LVF-Grünschnabel
*


Beiträge: 14
Registriert seit: May 2005

LabVIEW 18 SP1
2007
DE_EN

41470
Deutschland
Serieller Empfang mit Timeout
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


Angehängte Datei(en)
Sonstige .vi  Advanced_Serial_Write_and_Read.vi (Größe: 52,87 KB / Downloads: 198)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
04.11.2009, 16:21 (Dieser Beitrag wurde zuletzt bearbeitet: 04.11.2009 16:22 von Achim.)
Beitrag #2

Achim Offline
*****
*****


Beiträge: 4.223
Registriert seit: Nov 2005

20xx
2000
EN

978xx
Deutschland
Serieller Empfang mit Timeout
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!

"Is there some mightier sage, of whom we have yet to learn?"

"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
04.11.2009, 16:21
Beitrag #3

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Serieller Empfang mit Timeout
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

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
04.11.2009, 17:44 (Dieser Beitrag wurde zuletzt bearbeitet: 04.11.2009 18:20 von Lucki.)
Beitrag #4

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Serieller Empfang mit Timeout
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
05.11.2009, 08:40
Beitrag #5

marc10k Offline
LVF-Grünschnabel
*


Beiträge: 14
Registriert seit: May 2005

LabVIEW 18 SP1
2007
DE_EN

41470
Deutschland
Serieller Empfang mit Timeout
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
05.11.2009, 08:56
Beitrag #6

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Serieller Empfang mit Timeout
' 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
Sonstige .vi  Advanced_Serial_Write_and_Read_mod.vi (Größe: 54,82 KB / Downloads: 226)


Gruß, Jens

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
05.11.2009, 09:36
Beitrag #7

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Serieller Empfang mit Timeout
' 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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Überlauffehler bei serieller Schnittstelle DominikPl 14 11.207 29.05.2018 11:51
Letzter Beitrag: Kiesch
  Polling über USB RAW - Timeout funktioniert nicht MirkoB 3 5.074 06.09.2017 15:18
Letzter Beitrag: MirkoB
  Fehlermeldung bei serieller Schnittstelle Lab-Girl 3 5.967 02.02.2016 17:12
Letzter Beitrag: IchSelbst
  TimeOut error 6101 patriote00 15 13.819 18.12.2015 14:55
Letzter Beitrag: patriote00
  Synchrone Datenerfassung von Serieller Schnittstelle und DAQ darkbeppo 5 7.035 17.12.2014 12:46
Letzter Beitrag: GerdW
  VISA: Timeout Error (1073807339) TobSTAR 4 9.575 03.07.2014 09:22
Letzter Beitrag: TobSTAR

Gehe zu: