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.03.2021, 17:51 (Dieser Beitrag wurde zuletzt bearbeitet: 04.03.2021 17:52 von Gottimp.)
ich habe heute versucht ein einfaches Programm zu realisieren, welches mir eine 18 Byte Nachricht über eine serielle Schnittstelle (UART) ausliest und darstellt.(Siehe Anhang)
Leider funktioniert es noch nicht so wie gewünscht. Die zu lesende Nachricht besteht aus 18 Byte, wobei das 18te Byte der Terminator der Zeichenkette ist "\0".
Meine Fragen wären:
1. Muss ich dann bei Visa-lesen 17 oder 18 Byte angeben?
2. Wie kann ich die Terminierung auf "\0" setzen?
3. Kann jemand andere Fehler entdecken, weshalb das Programm nicht funktioniert?( etwas Grundlegendes außer Acht gelassen oder eher ein Hardwareproblem? Ich nutze digitus usb zu seriell konverter)
edit:
4. Spielt es eine Rolle ob ich die Anzeigeelemente in der Schleife habe oder nicht?
Falls euch noch weitere Informationen fehlen, um mir zu helfen, reiche ich diese gerne nach.
Ich freu mich auf eure Antworten, bleibt gesund
Gruß Gotti
Anzeige
04.03.2021, 18:22 (Dieser Beitrag wurde zuletzt bearbeitet: 04.03.2021 18:23 von jg.)
(04.03.2021 17:51 )Gottimp schrieb: 3. Kann jemand andere Fehler entdecken, weshalb das Programm nicht funktioniert?( etwas Grundlegendes außer Acht gelassen oder eher ein Hardwareproblem? Ich nutze digitus usb zu seriell konverter)
Was genau funktioniert denn nicht?
(04.03.2021 17:51 )Gottimp schrieb: edit:
4. Spielt es eine Rolle ob ich die Anzeigeelemente in der Schleife habe oder nicht?
Das kommt darauf an, was du erreichen willst. Aktuell wird nur der String "Lesepuffer" immer wieder aktualisisert, deine Einzelbytes erst nach Betätigung des Stopp-Buttons.
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!
Ich habe mittlerweile herausgefunden, dass ich dem uC zuerst einen String schicken muss, damit er die Daten überhaupt sendet.
Nun könnte ich tips gebrauchen wie ich es in mein Programm implementieren kann.
Ich habe mir das Beispiel VI UART 8N1 angeschaut, kann es aber nicht wirklich auf meine Problemstellung umändern, da dort nur gesendet und das gesendete empfangen wird.
Grundsätzlich wäre die Idee den "getData" String an den uC zu senden und dann die erwartete Antwort zu bekommen.
Kann mir jemand eine Beispiel VI als unterstützung empfehlen oder generell tips zur umsetzung des Vorhabens geben?
Könnte es mit der Sequenzstruktur funktionieren, dass ich quasi in der ersten Sequenz den String sende und in der zweiten Sequenz dann die Schnittstelle auslese?
Zitat:Ich habe mittlerweile herausgefunden, dass ich dem uC zuerst einen String schicken muss, damit er die Daten überhaupt sendet.
Nun könnte ich tips gebrauchen wie ich es in mein Programm implementieren kann.
Dann packe doch einfach ein VISAWrite vor die Schleife, um einmalig deinen "String" zu schicken.
Ansonsten gehört das VISAWrite in die Schleife, um den Befehl mehrmalig zu senden…
dummerweise können wir immer noch keine Bilder mit LabVIEW debuggen… (Ich bevorzuge LV2017.)
Zitat:Ich habe versucht es umzusetzen. (siehe Anhang)
Leider empfange ich noch nicht die gewünschten Daten mit dem Programm.
Vom Ablauf her sollte doch jetzt die Nachricht "getData \0" gesendet werden und dann empfängt er 17 Byte und endet mit \0.
Ich kann leider noch keinen logischen Fehler in dem Programm entdecken.
- Ein "Fehler" könnte durch den dicken fetten roten CoercionDot bewirkt werden…
- Ein weiterer Fehler könnte der Wert in deinem TermChar-Control darstellen: wir können leider keine Bilder debuggen! Warum ist das überhaupt ein Control und keine Konstante im Blockdiagramm???
- Wer hat gesagt, dass du den Empfangspuffer nach dem VISAWrite leeren sollst?
- "getData \0" enthält ein Space nach dem letzten "a", dein U8-Array aber nicht…
- Welchen Fehler bekommst du, wenn du nicht die erwartete Antwort vom Gerät bekommst?
Danke Gerd,
hätte mir auch klar sein können, dass das Bild nicht hilft.
- Ein "Fehler" könnte durch den dicken fetten roten CoercionDot bewirkt werden…
Sollte man lieber mit Ascii oder binär arbeiten?
- Ein weiterer Fehler könnte der Wert in deinem TermChar-Control darstellen: wir können leider keine Bilder debuggen! Warum ist das überhaupt ein Control und keine Konstante im Blockdiagramm???
Das habe ich aus einem Beispiel übernommen, ohne es zu hinterfragen. Da es bei mir aber mit Sicherheit bei \0 bleibt werde ich es in eine Konstante ändern.
- Wer hat gesagt, dass du den Empfangspuffer nach dem VISAWrite leeren sollst?
Auch da habe ich gedacht das der Puffer leer sein muss, wenn ich die Nachricht empfange, somit war es für mich nicht relevant wo es ist, solange es vor dem lesen kommt
- "getData \0" enthält ein Space nach dem letzten "a", dein U8-Array aber nicht…
Das liegt an meiner schlampigen Doku, die Nachricht enthält dort kein Leerzeichen
- Welchen Fehler bekommst du, wenn du nicht die erwartete Antwort vom Gerät bekommst?
Es passiert nix, bis ich das VI beende und es gibt einen Visa-Fehler.
Anbei das Programm
Benutzt du 2017 aus persönlichen Referenzen oder siehst du Vorteile in der Version?
Code immer so gut lesbar programmieren wie möglich. Das bedeutet dann aus meiner Sicht:
Den Sende-String als String anlegen - nicht mit den ASCII-Codes rumhantieren, und da du das Abschlußzeichen 0x0 in der Stringanzeige brauchst,
den Display-Style an der String-Konstanten aktivieren (Rechtsklick -> ...)
und dann die Anzeige des Strings auf "\Codes Display" umschalten (Linksklick auf den Display-Style):
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!
da kann ich Jens nur zustimmen: Code immer so gut lesbar programmieren wie möglich!
Dein VI nach meinem Aufräumen:
- String-Konstante wie von Jens beschrieben
- Am VISASerialPortInit nur das anschließen, was nötig ist! Und nötig sind nur die Werte, die sich von den Default-Werten unterscheiden…
- Kein EmptyBuffer…
- Einfaches Umwandeln deines Arrays vom ReadString in einen Cluster aus 17 U8-Werten. Der Cluster sollte noch typdefiniert werden und die Elemente nach deinen Vorgaben benannt werden…
Zitat:Es passiert nix, bis ich das VI beende und es gibt einen Visa-Fehler.
Weil in deiner Schleife jegliches Error-Handling fehlt!
Zitat:Benutzt du 2017 aus persönlichen Referenzen oder siehst du Vorteile in der Version?
Das ist die Version, die ich auf Arbeit benutze. Wenn du tagsüber Antworten von mir erwartest, musst du eben deine VIs in LV2017 bereitstellen.
Steht ja auch in meinem Profil…
Erstmal vielen Dank für eure guten Hilfen, ihr habt mir schon mega gut geholfen.
Da ich noch Laie bin würde ich noch gerne Fragen zu dem Programm stellen.(vielleicht auch weniger schlaue Fragen)
- Kein EmptyBuffer…
Die Idee hinter dem EmptyPuffer war immer die ganze Nachricht zu erhalten. versteh ich das richtig, dass es entfällt da nur auf Anfrage gesendet wird und somit der Puffer gar nicht voll sein kann und auch die nachricht selbst terminiert ist mit "\0"?
- Einfaches Umwandeln deines Arrays vom ReadString in einen Cluster aus 17 U8-Werten. Der Cluster sollte noch typdefiniert werden und die Elemente nach deinen Vorgaben benannt werden…
Typdefiniert bedeutet das Design im Frontpanel?
Weitere Verständnis Fragen:
-in deinem Programm steht "getData\00" aus anderen Programmiersprachen kenne ich nur "\0" gibts da ein Unterschied oder nur eine Null zu viel gedrückt?
-der uC antwortet nur nachdem er aufgefordert wurde mit getData, brauch ich da überhaupt noch die Schleife? Oder ist sie notwendig um alle Byte zu lesen?
-Also in der Schleife werden dann 18 Byte gelesen und im Cluster ausgegeben, wobei nochmal das 4 und 5 byte selektiert werden und zu einem 16 bit Integer zusammengeführt und Dargestellt werden?