LabVIEWForum.de - RS232 oder VISA

LabVIEWForum.de

Normale Version: RS232 oder VISA
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
Hallo zusammen,

ich habe einen Mikrocontroller programmiert, dass er mir zwei berechnete Werte per RS232 sendet. Das Programm sieht so aus:
amp = 2.5;
while(1)
{
real = _cosinus[i] * amp;
imag = _sinus[i] * amp;
Putf(real);
Putch1(';'Wink;
Putf(imag);
Putch1(10);
i+=3;
if(i == 360) i =0;
for(delay=10000;delay>0;delay--) __wait_nop();
}
Wenn ich die Zeile "for(delay=10000;delay>0;delay--) __wait_nop();" weglasse, dann habe ich ein Problem beim Datenlesen, und zwar, dass ich nicht eine kontinuelerische Kreis bekomme. Es gibt oefter Unterbrechungen beim Lesen. Ich glaube, dass LaView(VISA) zum schwitzen kommt.

Ich habe die UART unter meinem Kontroller auf 115200 Baud eingestellt, dass ich mehr lesen kann und 8N1.
Hat einer von ecuh eine Idee, wie ich maximale Daten lesen kann. Ich moechte alle Daten, die mein Kontroller zuschickt, darstellen.

Danke im Voraus.

ich verwende LV Lv86_img
' schrieb:Wenn ich die Zeile "for(delay=10000;delay>0;delay--) __wait_nop();" weglasse, dann habe ich ein Problem beim Datenlesen, und zwar, dass ich nicht eine kontinuelerische Kreis bekomme. Es gibt oefter Unterbrechungen beim Lesen.
Das sehe ich auch so.

Zitat:Ich glaube, dass LaView(VISA) zum schwitzen kommt.
Nein. Um es genauer zu sagen: Ganz bestimmt nicht.

Das VISA-Read liest immer den ganzen Puffer aus. Das ist auch richtig so. Nur: Im Puffer können ohne weiteres mindestens 10 Zahlpaare stehen. Von denen wertest du aber immer das erste Paar aus. Die restlichen neun Paare fehlen => Der Kreis ist unvollständig.

Wenn du die Warteschleife reinmachst, bewirkt das, dass im VISA-Puffer lediglich ein Zahlenpaar steht => Alles ok.

Den String, den du aus VISA ausliest, scannst du komplett. In dem 2D-DBL-Array stehen zwar alle Punkte drinnen - aber in den Graphen schreibst du immer nur den ersten Punkt auf dem Array? Warum?

Außerdem:
Es ist nicht garantiert, dass der zu scannende String das richtige Format (%f;%f/n) hat. Jenachdem, wann der Puffer gerade gelesen wird, ist das erste und/oder letzte Zahlenpaar unvollständig bis falsch.
Zitat:Den String, den du aus VISA ausliest, scannst du komplett. In dem 2D-DBL-Array stehen zwar alle Punkte drinnen - aber in den Graphen schreibst du immer nur den ersten Punkt auf dem Array? Warum?

Stimmt. Nach jedem gesplitete String wird ein Zahlenpaar berechnet und angezeigt.

Zitat:Außerdem:
Es ist nicht garantiert, dass der zu scannende String das richtige Format (%f;%f/n) hat. Jenachdem, wann der Puffer gerade gelesen wird, ist das erste und/oder letzte Zahlenpaar unvollständig bis falsch.
Das stimmt auch. Wenn ich jedes mal ein Array lesen moechte, koennte ich die erste und lestze Zelle loeschen, und damit wird eine reine Array (double) stehen.

Gibt es keine Alternative, mit der ich mein Programm beinflussen kann, dass er ohne Fehler die Daten als double und exakt Paarweise lesen kann. Ich weiss dass jede Zeile (aus Mikrocontroller %f;%fn = 13 oder 14 Byte) und wenn ich mein Buffer definiere 14/13 Byte x 512 = 7168/6656 Bytes kann?
' schrieb:Gibt es keine Alternative, mit der ich mein Programm beinflussen kann, dass er ohne Fehler die Daten als double und exakt Paarweise lesen kann.
Es gibt jede Menge Möglichkeiten.

Zitat:Ich weiss dass jede Zeile (aus Mikrocontroller %f;%fn = 13 oder 14 Byte) und wenn ich mein Buffer definiere 14/13 Byte x 512 = 7168/6656 Bytes kann?
Entweder Oder ist schon mal schlecht. Mach dein Programm im µC so, dass alle Zeilen gleich lang sind: also immer 14 Byte. Beginne jede Zeile mit dem selben Zeichen, z.B. STX. Dadurch kannst du eine Synchronisation machen. (Man kann auch das Endezeichen als Synchronisation verwenden - dann geht aber der erste Datensatz verloren.)

In LV machst du folgendes: Warte 100ms. In dieser Zeit läuft der Puffer, der natürlich groß genug vordefiniert werden muss, voll. Jetzt ließt du die Anzahl X der Zeichen im Puffer aus, berechnest die Zahl Y, die kleiner ist als X, aber ein Vielfaches von 14 (mit STX 15). Diese Anzahl Y liest du nun aus dem VISA-Puffer aus. Dieser String enthält nur ganze Datenpakete. Und sollte mit STX beginnen. Diesen String kannst du jetzt scannen und hast damit Y-14tel Punkte. Das Verarbeiten von 100 Datenpaaren im Stück geht erheblich schneller, als 100 Datenpaare einzeln zu verarbeiten.

Wenn auf der Datenleitung ein Zeichen kaputt geht, befinden sich zwischen STX und CR keine 13 Zeichen mehr, sondern nur noch 12. Das aber wäre ein kaputter Datensatz. Um derartige Ereignisse zu bearbeiten, muss der Algorithmus entsprechend angepasst werden.

Beachte auch folgendes:
Möglicherweise wäre es aufgrund der hohen Baudrate besser, das VISA-Auslesen in einer eigenen While-Schleife zu machen und die Daten per Queue an eine Auswerte-While-Schleife zu senden. Die Queue wird dann wie ein erweiterter Puffer wirken.
Zitat:Entweder Oder ist schon mal schlecht. Mach dein Programm im µC so, dass alle Zeilen gleich lang sind: also immer 14 Byte. Beginne jede Zeile mit dem selben Zeichen, z.B. STX. Dadurch kannst du eine Synchronisation machen. (Man kann auch das Endezeichen als Synchronisation verwenden - dann geht aber der erste Datensatz verloren.)
Die positive und die negative Werte beeinflussen die Zeilenlaenge, ich gehe mal davon aus. Wenn beide Werte positiv sind dann 12 und wenn eine negativ ist dann 13 und wenn beide negativ sind dann 14.

Mit dem STX habe ich ueberhaupt nicht verstanden, was Du meinst.

Zitat:In LV machst du folgendes: Warte 100ms. In dieser Zeit läuft der Puffer, der natürlich groß genug vordefiniert werden muss, voll. Jetzt ließt du die Anzahl X der Zeichen im Puffer aus, berechnest die Zahl Y, die kleiner ist als X, aber ein Vielfaches von 14 (mit STX 15). Diese Anzahl Y liest du nun aus dem VISA-Puffer aus. Dieser String enthält nur ganze Datenpakete. Und sollte mit STX beginnen. Diesen String kannst du jetzt scannen und hast damit Y-14tel Punkte. Das Verarbeiten von 100 Datenpaaren im Stück geht erheblich schneller, als 100 Datenpaare einzeln zu verarbeiten.
Ich habe so gemacht, dass ich das ganze Paacket splite, danach das erste und das letzte Zahlenpaar loesche, damit meine Array sauber bleibt. Es hat auch keine Einfluss auf die Darstellung.

Zitat:Beachte auch folgendes:
Möglicherweise wäre es aufgrund der hohen Baudrate besser, das VISA-Auslesen in einer eigenen While-Schleife zu machen und die Daten per Queue an eine Auswerte-While-Schleife zu senden. Die Queue wird dann wie ein erweiterter Puffer wirken.
Ich werde es probieren.
' schrieb:Die positive und die negative Werte beeinflussen die Zeilenlaenge, ich gehe mal davon aus. Wenn beide Werte positiv sind dann 12 und wenn eine negativ ist dann 13 und wenn beide negativ sind dann 14.
Wenn der Datensatz immer gleich lang ist, erleichtert das im Fehlerfall die Fehleranalyse.

Zitat:Mit dem STX habe ich ueberhaupt nicht verstanden, was Du meinst.
Da käme ich nochmals darauf zurück, wenn du die anderen Feinheiten geregelt hast.

Zitat:Ich habe so gemacht, dass ich das ganze Paacket splite, danach das erste und das letzte Zahlenpaar loesche, damit meine Array sauber bleibt. Es hat auch keine Einfluss auf die Darstellung.
Damit gehen dir automatisch zwei Wertepaare verloren (Solange du sowas akzeptierst, brauchst du die Sache mit dem STX nicht).



Wie sieht es denn jetzt mit dem gesplitteten String aus? Wird da jetzt immer noch nur das erste Wertepaar angezeigt oder doch alle?
' schrieb:... Ich moechte alle Daten, die mein Kontroller zuschickt, darstellen...
' schrieb:...Ich habe so gemacht, dass ich das ganze Paacket splite, danach das erste und das letzte Zahlenpaar loesche, damit meine Array sauber bleibt. ...

Also da widersprichst du dir doch selbst...!


Zum Thema gleichlange Strings kann icn nur sagen...
...wo es ein Minus gibt, gibt's auch immer ein Plus.


Gruß SeBa
Hi Seba

Zitat:Also da widersprichst du dir doch selbst...!
Warum???
Aus dem Grund, dass ein Fehler auf die erste und letzte Zeile auftaucht, habe ich die beiden geloescht. Wo ist das Problem????

Zitat:Zum Thema gleichlange Strings kann icn nur sagen...
...wo es ein Minus gibt, gibt's auch immer ein Plus.

Fuer ein Minus brauchst Du ein Zeichen aber fuer Plus nicht. Wir reden uerber die Uebertragung von Strings und nicht uerber die Zahlen. wenn Du jede einzelen Linie beobachtest, dann werdest Du es sehen.

gruss Tetef
' schrieb:Fuer ein Minus brauchst Du ein Zeichen aber fuer Plus nicht. Wir reden uerber die Uebertragung von Strings und nicht uerber die Zahlen.
Nichts einfacher als das: Statt Strings SGL übertragen macht 12 Zeichen: 4 Byte für Wert Eins + 4 Byte für Wert Zwei + 4 Byte für NAN als Synchro.
' schrieb:Hi Seba
Warum???
Aus dem Grund, dass ein Fehler auf die erste und letzte Zeile auftaucht, habe ich die beiden geloescht. Wo ist das Problem????
--> Das Problem ist, dass du sagst "Ich will ALLES anzeigen was der µC schickt." und dann schreibst du, dass du Daten die vom µC kommen löschst (weil sie dir grad nicht passen)...

Fuer ein Minus brauchst Du ein Zeichen aber fuer Plus nicht. Wir reden uerber die Uebertragung von Strings und nicht uerber die Zahlen. wenn Du jede einzelen Linie beobachtest, dann werdest Du es sehen.
--> Genau! Wir reden von Strings... "+1.45" ist ein String genau wie "-1.45"
Wenn du immer gleich lange Strings vom µC aus verschicken willst und zwar unabhängig ob eine Zahl negativ ist oder beide oder keine...
...dann sogrst du halt dafür dass die "Zahlen" immer gleich lang sind. Der µC kann durchaus ein "+" senden und dann die positive Zahl oder einfach nur die negative Zahl. Die Stings werden immer gleich lang bleiben, da entweder ein + oder ein - vor der Zahl steht.

Was für ein Glück das wir über Strings reden und nicht über Zahlen.Wink
gruss Tetef

Gruß SeBa
Seiten: 1 2 3
Referenz-URLs