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 

lesen von der seriellen schnittstelle



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!

14.09.2005, 08:25
Beitrag #11

Oliver Listing Offline
LVF-Freak
****


Beiträge: 721
Registriert seit: Sep 2004

2012 und 2014 (Windows und Linux)
1998
EN

22844
Deutschland
lesen von der seriellen schnittstelle
Hi roman,

ich verstehe dein Problem so:
Du sendest einen Befehl an dein Gerät. Dieses antwortet immer mit 19 Zeichen. Nie mit 18 oder mit 20 - richtig?
Um einer Fehlerhaften Übertragung vorzubeugen, hast du nun versucht eine Abbruchbedingung einzubauen, die auslöst, wenn dreimal kein Zeichen kam. Richtig?

Davon ausgegangen habe ich folgendes zu ergänzen:
Was Buhrz meint (das Zeitliche Problem) kommt schon hin, bedenkt man, das jedes Gerät selbst eine gewisse Zeitbenötigt, um die Antwort zu schicken - von der Übertragungsrate mit 1200 Baud mal ganz abgesehen.
Ich würde aber zum erkennen eines Fehlers die VISA Optionen nutzen, die dir geboten werden:
- sendet dein Gerät (ganz zufällig) ein Endezeichen mit (z.B. n, rn oder ähnliches)??? Dann solltest du dies in der Initialisierungs Funktion auch einstellen.
Folglich brauchtest du nur noch sagen "ließ 100 Zeichen" und LabVIEW stoppt die read Funktion automatisch bei erkanntem Endezeichen.
- existiert kein Endezeichen, so sollte diene Anweisung lauten "lese 19 Zeichen" sind 19 Zeichen angekommen, so werden sie dir ausgegeben - ohne Fehlermeldung. Fehlen aber noch Zeichen, so wird dir nach der eingestellten Timeout Zeit eine Fehlermeldung ausgegeben.
- Sind wir also beim einzustellenden Timeout: Teste aus, wie lange deine Verarbeitung und darstellung braucht. Nehme einen Sicherheitszuschlag dazu und den Rest zu einer Sekunde kannst du als Timeoutwert setzen.
Deine 19 Zeichen benötigen mind. 16ms bei 1200 Baud zusätzlich der Reaktionszeit des Gerätes. Dies muß natürlich (wird es schon) innerhalb deiner eingestellten Timeout Zeit liegen.
- Um fehlerhaften oder verstümmelten Übertragungen vorzubeugen, solltest du vor jedem senden deines Befehles einmal den Eingangsbuffer der Schnittstelle leeren. Sonst konntest du (ohne genutztem Endezeichen) ev. aus deinem Rahmen laufen und deine Auswertung wäre schlicht falsch.

So genug geschrieben - nun kannst du ans umsetzen gehen.
Solltest du dazu noch Fragen haben wende dich einfach wieder an uns.

Gruß
Oliver
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.09.2005, 08:46
Beitrag #12

roman_bock Offline
LVF-Grünschnabel
*


Beiträge: 12
Registriert seit: Sep 2005



kA



lesen von der seriellen schnittstelle
hi!

danke nochmal für eure tadellose unterstützung.hab eure ideen umgesetzt und es funktioniert.

gruss
roman
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.09.2005, 14:41
Beitrag #13

roman_bock Offline
LVF-Grünschnabel
*


Beiträge: 12
Registriert seit: Sep 2005



kA



lesen von der seriellen schnittstelle
hi martin!

ich hätte da noch eine bitte an dich.

könntest du mir erklären,was das "enable termination char" für einen sinn hat. oder besser gesagt,dessen funktion,wenn man es auf false setzt.

hab es nämlich auch auf true gesetzt und es ergab keinen unterschied im programm.

gruss
roman
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.09.2005, 14:46
Beitrag #14

roman_bock Offline
LVF-Grünschnabel
*


Beiträge: 12
Registriert seit: Sep 2005



kA



lesen von der seriellen schnittstelle
hi oliver!

ich hätte da noch eine bitte an dich.

könntest du mir sagen,wie man von einer seriellen alles löscht.
gibt es da im LabVIEW 6.1 ein fertiges vi.

hab nämlich eh probleme mit dem müll.

wollte es folgendermaßen lösen: hab nach der init immer abgefragt,ob noch bytes am port liegen und diese dann herausgelesen.und dann erst den sende befehl geschickt.
keine gut lösung. :oops:

gruss
roman
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.09.2005, 15:21
Beitrag #15

Oliver Listing Offline
LVF-Freak
****


Beiträge: 721
Registriert seit: Sep 2004

2012 und 2014 (Windows und Linux)
1998
EN

22844
Deutschland
lesen von der seriellen schnittstelle
Hi roman,

klar gibt es da ein nettes VI für:
FunctionsInstrument I/OVISAVISA AdvancedInterface SpecificVISA Flush I/O Buffer

Zu deiner Frage im anderen Post "serielle schnittstelle" kann ich dir nur nochmal folgendes deutlicher erklären, was ich oben schon geschrieben habe:
Oliver Frank schrieb:Ich würde aber zum erkennen eines Fehlers die VISA Optionen nutzen, die dir geboten werden:
- sendet dein Gerät (ganz zufällig) ein Endezeichen mit (z.B. n, rn oder ähnliches)??? Dann solltest du dies in der Initialisierungs Funktion auch einstellen.
Folglich brauchtest du nur noch sagen "ließ 100 Zeichen" und LabVIEW stoppt die read Funktion automatisch bei erkanntem Endezeichen.
Du hast oben bei der Funktion VISA Configure Serial Port drei wichtige Anschlüsse, die dir die Möglichkeit bieten auf ein Rahmenendezeichen zu reagieren.

Rahmenendezeichen: Viele Geräte schicken nicht nur die bloße Antwort zurück, sondern Signalisieren auch noch zusätzlich das Ende der Antwort. Dieses zusätzliche Zeichen ist Teil des Protokolls über die Schnittstelle und wird immer mitgesendet. Da man die gesamten Zeichen, die gesendet wurden als Rahmen bezeichnet, heißt dieses Zeichen Rahmenendezeichen (zu engl. termination char)
Per Default ist das Termination Char bei LV auf 0xA bzw n oder LF eingestellt. Damit LV nun aber nicht immer dieses Zeichen erwartet kann man es zusätzlich mit Enable Termination Char aktivieren.

Der read-Funktion wird nun am Eingang byte count eine hohe nicht zu erwartende Zahl angelegt (z.B. 1000). Die Funktion wartet jetzt entweder bis:
a) 1000 Zeichen am Eingangsbuffer angekommen sind
B) das Termination Char empfangen wurde oder
c) die eingestellte Timeout Zeit verstrichen ist.

Da die Byte Count-Zahl bewust zu groß gewählt wurde, bricht die Funktion also mit empfangen des Termination Char ab und übergibt somit einen kompletten Rahmen. Dieser kann dann noch überprüft werden (Länge, ev. Checksumme, usw.) und für gültig erklärt und zur Weiterverarbeitung gegeben werden.

Also kurz gesagt, genau das, was du brauchst...

Gruß
Oliver

P.s. darf ich nun deine beiden Posts zusammenfügen - sie behandeln doch offentsichtlich nur ein Problem, oder?

Edit: Es ist vollbracht - ich hoffe nun können wir die Hilfe etwas bündeln, dann erklären nicht zwie Leute in zwei Posts das gleiche...
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.09.2005, 15:42
Beitrag #16

Martin.Henz Offline
LVF-Team
LVF-Team

Beiträge: 429
Registriert seit: Jan 2005

2.5.1 bis 20
1992
kA

74363
Deutschland
lesen von der seriellen schnittstelle
roman_bock schrieb:könntest du mir erklären,was das "enable termination char" für einen sinn hat. oder besser gesagt,dessen funktion,wenn man es auf false setzt.

Vorausgesetzt, es tritt kein Timeout auf:

Wenn "enable termination char" gleich TRUE ist, dann bricht die Lesefunktion den Vorgang ab, sobald der "termination character" empfangen wurde oder wenn die angeforderte Anzahl Zeichen empfangen wurde.

Wenn "enable termination char" gleich FALSE ist, dann liest die Lesefunktion exakt so viele Bytes wie angegeben.

Nehmen wir mal an, dein Gerät sendet eine unterschiedliche Anzahl Bytes, sagen wir mal zwischen 1 und 100 Bytes. Das Gerät sendet jedoch am Ende jeder Übertragung immer ein Linefeed (n). Wenn du dann "enable termination char" auf TRUE setzt und als "termination character" ein Linefeed angibst, dann kannst du bei der Lesefunktion immer mehr als 100 Bytes anfordern (z.B. immer 200). Die Lesefunktion wird immer beim Linefeed das Lesen beenden und dir die gesendeten Bytes (einschließlich des Linefeeds) liefern.

Zitat:hab es nämlich auch auf true gesetzt und es ergab keinen unterschied im programm.
Bei deinem Programm bei dem du immer nur ein einziges Zeichen von der seriellen Schnittstelle liest, macht das auch nicht wirklich einen Unterschied.

BTW: Wenn du einmal den Error-out Cluster von VISA Read betrachtest, dann kannst du feststellen, dass dort eine Warnung eigetragen wird. Anders Formuliert: Es wird ein Fehlercode eingetragen, ohne den Fehlerstatus auf true zu setzen. Voraussetzung ist aber, dass zuvor der Fehlercode gleich 0 ist. Der Fehlercode sagt entweder, dass die angeforderte Anzahl Bytes empfangen wurde, oder dass das Abschlusszeichen empfangen wurde.

Martin Henz
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.09.2005, 07:23
Beitrag #17

roman_bock Offline
LVF-Grünschnabel
*


Beiträge: 12
Registriert seit: Sep 2005



kA



lesen von der seriellen schnittstelle
hi!

natürlich darfst du das.

und danke nochmal.

werd es gleich ausprobieren.

gruss roman
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
  VISA: I/O Fehler beim Auslesen einer seriellen Schnittstelle konne 5 7.619 19.07.2017 13:04
Letzter Beitrag: konne
  Alle seriellen Schnittstellen auslesen Exl 1 5.068 01.04.2017 16:41
Letzter Beitrag: GerdW
  Modul am seriellen Port ansprechen Charly82 2 5.921 22.05.2016 07:34
Letzter Beitrag: Charly82
  Daten von Seriellen Port in While-Schleife auswerten Bensch 4 6.269 26.10.2015 11:28
Letzter Beitrag: Bensch
  Problem bei seriellen Schnittstellen gammel 7 7.372 27.10.2014 13:01
Letzter Beitrag: gammel
  Lesen der seriellen Schnittstelle EIA-232 (RS232) AnhTeo 4 7.291 06.09.2011 03:15
Letzter Beitrag: AnhTeo

Gehe zu: