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!
ich habe ein VI geschrieben, in dem ich über eine serielle Schnittstelle drei Befehle (Schalten in Remote-Betrieb, Parameter einstellen, Rückstellen aus Remote-Betrieb) an meinen Generator sende.
Hierbei muss ich in der Read-Funktion die Anzahl der Bytes angeben, die empfangen werden sollen, um die Antwort der seriellen Schnittstelle auszulesen (bei mir über numerische Konstanten auf 17, 4 und 4 festgelegt).
Die Antwort des Gerätes ist allerdings immer unterschiedlich lang. Ich muss also vor dem Senden schon die Länge der Antwort kennen, kenne ich aber nicht.
Weiß jemand, wie ich das lösen kann? Schon mal lieben Dank und viele Grüße!
Dein Generator wird doch wahrscheinlich am Ende einer Antwort ebenfalls ein Linefeed senden (und auch eine Checksumme).
Beim öffnen der Schnittstelle bzw. einstellen der Parameter hast du "Enable Termination Character" abgeschaltet. Das muss dabei eingeschaltet werden. Der "termination char" ist schon auf Linefeed eingestellt.
Beim lesen gibst du dann nur noch die maximale Anzahl Bytes an, die du lesen willst, als z.B. einfach 256 Bytes. Sobald ein Linefeed empfangen wird, wird auch die Read Funktion beendet. BTW: Mit LabVIEW hat das gar nichts zu tun. Das wäre in jeder anderen Programmiersprache auch nicht anders.
Hallo ihr Lieben,
mein Programm hat sich fortentwickelt, das Problem ist aber immer noch das gleiche: das Auslesen der Rückgabewerte.
Ich kommuniziere mit einer serielle Schnittstelle und lese die Antworten aus, indem ich die am Generator eingestellte Testdauer warte. Ich möchte aber gerne nur warten, bis eine Antwort empfangen wurde und dann maximal die Testdauer, bekomme dies aber nicht implementiert. Datengesteuert sozusagen. Zusätzlich gibt es bei meinem neuen Generator nun auch die Möglichkeit, dass pro Befehl nicht nur eine Rückmeldung kommt, sondern mehrere. Auch hier weiß ich nicht, wie ich dies implementieren kann. Gibt es auch hier eine datengesteuerte Lösung anstatt die Anzahl an Impulsen in eine Schleife zu geben. Hoffe, so weit verständlich. Ein VI mit einer möglichen Kommunikation hänge ich an.
LG Kaya
09.10.2023, 11:49 (Dieser Beitrag wurde zuletzt bearbeitet: 09.10.2023 11:52 von GerdW.)
Zitat:Ich möchte aber gerne nur warten, bis eine Antwort empfangen wurde und dann maximal die Testdauer, bekomme dies aber nicht implementiert. Datengesteuert sozusagen.
Gib doch bitte mal ein konkretes Beispiel, was "warten bis zur Antwort" und "dann maximal die Testzeit warten" genau bedeutet? Und vergiss bei einem konkreten Beispiel bitte auch nicht, dass du beim SerialPortInit einen Timeout von 1000ms definiert hast!
Warum verwendest du zum Warten die Funktion "Wait until next multiple"? Du kennst den Unterschied zum "normalen" Wait?
Zitat:Zusätzlich gibt es bei meinem neuen Generator nun auch die Möglichkeit, dass pro Befehl nicht nur eine Rückmeldung kommt, sondern mehrere. Auch hier weiß ich nicht, wie ich dies implementieren kann. Gibt es auch hier eine datengesteuerte Lösung anstatt die Anzahl an Impulsen in eine Schleife zu geben. Hoffe, so weit verständlich.
Von welchen "Impulsen" redest du hier? Wieso benötigst du "Impulse", wenn ein Befehl mehrere Rückmeldungen gibt??? (Nein, die Frage ist nicht verständlich…)
Weißt du, wieviele Antworten der Befehl senden wird, wenn mehrere möglich sind?
Ich hab ein VI erstellt, was das Ganze hoffentlich verdeutlicht. Ich öffne meinen Port, mache eine Verbindungskontrolle mit meinem Generator (Port öffnen SubVI Burst). Dann schreibe ich den VN-Befehl für den Teststart und übergebe die Parameter und mit AA; wird der Test gestartet.
Jetzt kommt der Part, den ich leider einfach nicht hinbekomme: der Generator erzeugt Rückmeldungen, die in unregelmäßigen Abständen kommen, die ich alle auslesen und verarbeiten möchte. Ich weiß nicht, wie viele Antworten gesendet werden oder wann sie kommen. Mein Ansatz ist eine Schleife mit einer Pause, die ausließt bis keine Antworten mehr kommen. Das meine ich mit "warten bis zur Antwort".
Die Impulse sind das, was der Generator erzeugt. Ich gebe eine Anzahl an Impulsen und eine Testdauer vor.
Danke für Eure Hilfe!
LG Kaya
Anzeige
23.10.2023, 12:18 (Dieser Beitrag wurde zuletzt bearbeitet: 23.10.2023 12:21 von GerdW.)
Zitat:Ich hab ein VI erstellt, was das Ganze hoffentlich verdeutlicht. Ich öffne meinen Port, mache eine Verbindungskontrolle mit meinem Generator (Port öffnen SubVI Burst). Dann schreibe ich den VN-Befehl für den Teststart und übergebe die Parameter und mit AA; wird der Test gestartet.
Wo genau sieht man das in deinen (neuen) VIs?
Ich finde nur die Befehle "CC" und "EN"…
Zitat:der Generator erzeugt Rückmeldungen, die in unregelmäßigen Abständen kommen, die ich alle auslesen und verarbeiten möchte. Ich weiß nicht, wie viele Antworten gesendet werden oder wann sie kommen. Mein Ansatz ist eine Schleife mit einer Pause, die ausließt bis keine Antworten mehr kommen. Das meine ich mit "warten bis zur Antwort".
Du meinst also "warten bis keine Antwort mehr kommt" anstatt "warten bis zur Antwort"!?
Kannst du eine Zeitspanne angeben, nach der "keine Antwort mehr kommt"? Das ist der kritische Punkt in diesem Problem - und zeigt auch die Lösung auf…
Zitat:Ich gebe … eine Testdauer vor.
Ist das eventuell die Zeit, nach der "keine Antworten mehr kommen"?
Deine neuen VIs passen nicht zu deiner Message und es fehlen immer noch Informationen…
Hab mich beim Upload mit dem Generator vertan, CC; ist die Verbindungskontrolle, EN,... übergibt die Parameter, AA; startet die Prüfung.
Ich denke ich muss quasi beides tun. Erst "warten bis eine Antwort kommt" und dann "warten bis keine Antwort mehr kommt".
Eine Zeitspanne, nach der "keine Antwort mehr kommt" hab ich zwar in dem Sinne nicht, weil die Zeit nach der "keine Antworten mehr kommen" unterschiedlich ist.
Ich glaube der Generator sendet aber immer bei vollendetem Test ein "RR 00;". Vielleicht ist es eine Möglichkeit, bis zu dieser Rückmeldung zu warten.
LG Kaya
24.10.2023, 14:28 (Dieser Beitrag wurde zuletzt bearbeitet: 24.10.2023 14:32 von GerdW.)
Zitat:Ich denke ich muss quasi beides tun. Erst "warten bis eine Antwort kommt" und dann "warten bis keine Antwort mehr kommt".
Das ist nur eine Frage der Wartezeit: die Zeit bis zum "es kommt keine Antwort mehr" muss größer sein als die Zeit bis "eine Antwort kommt"…
Also z.B. in einer Schleife immer eine Sekunde (dein TimeOut-Wert!) auf eine Antwort warten und wenn etwas kommt, auch auswerten. Wenn aber eine bestimmte Anzahl Iterationen, z.B. 20 Iteration entsprechend 20s, keine Antwort kam, wird abgebrochen…
Zitat:Eine Zeitspanne, nach der "keine Antwort mehr kommt" hab ich zwar in dem Sinne nicht, weil die Zeit nach der "keine Antworten mehr kommen" unterschiedlich ist.
Was heißt "unterschiedlich? Unterschiedlich wie "2500ms != 2501ms" oder "2500ms != 20h"?
Zitat:Ich glaube der Generator sendet aber immer bei vollendetem Test ein "RR 00;". Vielleicht ist es eine Möglichkeit, bis zu dieser Rückmeldung zu warten.
Oh Mann, du "glaubst"… (Programmierer sollten "wissen", wenn sie nicht gerade ein KI-Modell auf ihre Daten loslassen! )
Gibt es denn keine (verlässliche) Dokumentation zu deinem Gerät?
Entweder dein Gerät sendet eine "Test beendet"-Botschaft oder es tut es nicht…
Und wenn dein Gerät eine solche Botschaft sendet, dann solltest du eine StateMachine programmieren mit den States 1/"Init", 2/"Acquire" und 3/"De-Init". Übergangsbedingung von State 2 zu 3 ist dann die "RR"-Botschaft…
Schlussbemerkung: Programmieren basiert (fast immer) auf harten Fakten - das hast du in mehreren Wochen, die du hier fragst, noch immer nicht gelernt. Ständig kommt "glauben", "unterschiedlich", "ich denke ich muss", "vielleicht", aber nie "ich warte maximal 10min"…