28.06.2010, 19:55
Hi, ich bin gerade dabei mein erstes etwas größeres Programm in LabVIEW zu schreiben.
Es geht darum, einem Mikrocontroller über RS232 Befehle zu schicken und welche von ihm zu empfangen.
Ich übertrage die Werte aber nicht in Klartext, also als ASCII Zeichen, sondern als wirkliches Byte (z.B. 65 ist nicht "65" sondern 'A', damit die Übertragung schneller ist.
Ein Befehl sieht etwa so aus: (Die einzelnen Bytes sind als Dezimalzahl 0...255 geschrieben)
000......die ersten 4 Byte sind die Start-Sequenz. Sie zeigen an dass ein "Datenpaket" beginnt
255
255
255
1.........Befehl, z.B. Position von Servo 1, Geschwindigkeit von Motor 3, ...
22.......high-Byte
156......low-Byte
2.........nächster Befehl
34.......wieder ein high Byte
21.......wieder ein low Byte
6.........nächster Befehl
... usw
Im 50ms werden diese Befehle von LabVIEW an den Mikrocontroller gesendet, der Mikrocontroller sendet gleichzeitig im 35ms-Rythmus die Sensordaten an LabVIEW (sieht genauso aus, nur werden statt Steuerbefehlen Sensordaten, z.B. "Bodenabstand vorne" gesendet).
Die Sequenz 000 255 255 255 wird verwendet, um anzuzeigen, dass ein neues "Datenpaket" beginnt. Befehl darf nicht 255 sein, sondern nur 0...254. Dann ist sichergestellt, dass die Sequenz 000 255 255 255 nie im normalen Datenfluss vorkommt, sondern eben nur wenn eine neues Datenpaket beginnt.
Auf der Mikrocontroller-Seite funktioniert alles, aber LabVIEW macht mir Probleme, ich kenn mich da leider noch nicht so gut aus...
Das senden funktioniert soweit recht gut, und schnell. Das Servo das ich bewegen will bewegt sich fast in Echtzeit mit.
Als ich aber dann das lesen dazuprogrammiert habe, hat das die ganze Kommunikation ausgebremst... Je größer ich den Buffer eingestellt habe, desto langsamer wurde alles. Während gelesen wurde, konnte das Servo nur noch ruckartig bewegt werden, obwohl ich am Code zum Schreiben nichts verändert habe.
Ich vermute das liegt daran, dass der Lesebuffer ständig voll ist. Ich glaube da muss man irgendwie eine Queue einbauen, aber ich habe mir schon die LabVIEW Hilfe durchgelesen und das Terminal Beispiel heruntergeladen und angeschaut, aber ich habe keine Ahnung wie ich das in mein Programm einbauen soll.
Wenn man in ASCII Zeichen sendet, kann man ja bei dem VI für die Initialisierung von VISA einen Termination Char angeben, z.B. n
Für meine Anwendung reicht aber ein Termination Char nicht aus, weil für die Variablenwerte jeder Char auftreten kann. Ich müsst irgendwie einen Termination String angeben, nämlich 000 255 255 255.
Gibt es eine Möglichkeit so einen Termination String anzugeben?
Wenn nicht, wie sollte ich mein Programm verbessern, damit ordentliches Empfangen möglich ist? Ist eine Queue ein guter Ansatz?
lg Christoph
PS: Im Anhang ist mein VI, es ist von LabVIEW Version 8.6 (englisch).
Es geht darum, einem Mikrocontroller über RS232 Befehle zu schicken und welche von ihm zu empfangen.
Ich übertrage die Werte aber nicht in Klartext, also als ASCII Zeichen, sondern als wirkliches Byte (z.B. 65 ist nicht "65" sondern 'A', damit die Übertragung schneller ist.
Ein Befehl sieht etwa so aus: (Die einzelnen Bytes sind als Dezimalzahl 0...255 geschrieben)
000......die ersten 4 Byte sind die Start-Sequenz. Sie zeigen an dass ein "Datenpaket" beginnt
255
255
255
1.........Befehl, z.B. Position von Servo 1, Geschwindigkeit von Motor 3, ...
22.......high-Byte
156......low-Byte
2.........nächster Befehl
34.......wieder ein high Byte
21.......wieder ein low Byte
6.........nächster Befehl
... usw
Im 50ms werden diese Befehle von LabVIEW an den Mikrocontroller gesendet, der Mikrocontroller sendet gleichzeitig im 35ms-Rythmus die Sensordaten an LabVIEW (sieht genauso aus, nur werden statt Steuerbefehlen Sensordaten, z.B. "Bodenabstand vorne" gesendet).
Die Sequenz 000 255 255 255 wird verwendet, um anzuzeigen, dass ein neues "Datenpaket" beginnt. Befehl darf nicht 255 sein, sondern nur 0...254. Dann ist sichergestellt, dass die Sequenz 000 255 255 255 nie im normalen Datenfluss vorkommt, sondern eben nur wenn eine neues Datenpaket beginnt.
Auf der Mikrocontroller-Seite funktioniert alles, aber LabVIEW macht mir Probleme, ich kenn mich da leider noch nicht so gut aus...
Das senden funktioniert soweit recht gut, und schnell. Das Servo das ich bewegen will bewegt sich fast in Echtzeit mit.
Als ich aber dann das lesen dazuprogrammiert habe, hat das die ganze Kommunikation ausgebremst... Je größer ich den Buffer eingestellt habe, desto langsamer wurde alles. Während gelesen wurde, konnte das Servo nur noch ruckartig bewegt werden, obwohl ich am Code zum Schreiben nichts verändert habe.
Ich vermute das liegt daran, dass der Lesebuffer ständig voll ist. Ich glaube da muss man irgendwie eine Queue einbauen, aber ich habe mir schon die LabVIEW Hilfe durchgelesen und das Terminal Beispiel heruntergeladen und angeschaut, aber ich habe keine Ahnung wie ich das in mein Programm einbauen soll.
Wenn man in ASCII Zeichen sendet, kann man ja bei dem VI für die Initialisierung von VISA einen Termination Char angeben, z.B. n
Für meine Anwendung reicht aber ein Termination Char nicht aus, weil für die Variablenwerte jeder Char auftreten kann. Ich müsst irgendwie einen Termination String angeben, nämlich 000 255 255 255.
Gibt es eine Möglichkeit so einen Termination String anzugeben?
Wenn nicht, wie sollte ich mein Programm verbessern, damit ordentliches Empfangen möglich ist? Ist eine Queue ein guter Ansatz?
lg Christoph
PS: Im Anhang ist mein VI, es ist von LabVIEW Version 8.6 (englisch).