Hallo zusammen,
ich hoffe ihr könnt mir helfen.
Mein ct'lab ist via USB mit meinem Windows 7 Laptop verbunden. Auf dem Laptop läuft eine in Qt geschriebene Software, welche mit einem Takt von 100ms die Werte vom ct'lab ausliest und neue Parameter zum ct'lab überträgt.
Das Ganze funktioniert grundsätzlich wohl und die Befehle werden die meiste Zeit korrekt abgearbeitet. Mein Problem tritt nur sporadisch und unvorhersehbar auf und äußert sich durch falsche Daten an den Mess- und Regelleitungen. So springt ein Bit plötzlich grundlos auf 1, am DA Wandler liegen statt 3 für einen ganz kurzen Moment 10 Volt an und beim Aufzeichnen des AD Wandlers habe ich im Graphen eine unerklärliche Spitze.
Ich habe schon mehrere Rechner und ct'Lab Platinen getestet und würde einen Hardware Fehler demnach ausschließen.
Beim virtuellen COM Port kann man Einstellungen vornehmen. Ich glaube dass das geschilderte Verhalten weniger häufig autritt, wenn ich dort kleinere Werte bei Wartezeit und Größe der übertragenen Dateien einstelle. Leider lassen sich die Probleme aber auch damit nicht komplett abstellen.
Ich kommuniziere ansonsten mit den Einstellungen 38400 8n1.
Hat vielleicht noch jemand einen Tipp für mich, wie die Kommunikation stabiler laufen könnte?
Danke und Gruß
Hans-Günther
PS: Ich liefere gerne weitere Infos zu, bitte einfach mitteilen, was benötigt wird!
Kommunikationsproblem mit ct'lab und ADA-IO Platine
-
- träumt vom eigenen c't-Lab
- Beiträge: 5
- Registriert: 20.05.2011, 18:57
Kommunikationsproblem mit ct'lab und ADA-IO Platine
- Dateianhänge
-
- Einstellung COM Port
- ctlab.png (61.77 KiB) 4405 mal betrachtet
Re: Kommunikationsproblem mit ct'lab und ADA-IO Platine
Hallo Hans-Günther,
ohne Deine Software zu kennen vermute ich Pufferüberlauf im Modul.
Hast Du die Pascal- oder die C-Firmware? Verwendest Du die Checksummen?
In der C-Firmwaren habe ich eine Ausgabe eingebaut, wenn die Checksumme nicht paßt: So ungefähr:Es wird das Kommando ausgegeben, so wie es im Puffer drinstand und die berechnete Checksumme.
Es kommt immer drauf an, was das Modul grade macht und dann kann ein Kommando schon mal etwas länger dauern. Wenn Du dann bei den Abfragen einfach senden solltest ohne die Antwort abzuwarten, dann läuft da schon mal was über. Der Puffer hat nur 128 Zeichen und der Chip kein FIFO.
Grüße
Paul
ohne Deine Software zu kennen vermute ich Pufferüberlauf im Modul.
Hast Du die Pascal- oder die C-Firmware? Verwendest Du die Checksummen?
In der C-Firmwaren habe ich eine Ausgabe eingebaut, wenn die Checksumme nicht paßt: So ungefähr:
Code: Alles auswählen
#1:Command was "1:idn$00" CS:68
#1:255=7 [CHKSUM]
Es kommt immer drauf an, was das Modul grade macht und dann kann ein Kommando schon mal etwas länger dauern. Wenn Du dann bei den Abfragen einfach senden solltest ohne die Antwort abzuwarten, dann läuft da schon mal was über. Der Puffer hat nur 128 Zeichen und der Chip kein FIFO.
Grüße
Paul
-
- träumt vom eigenen c't-Lab
- Beiträge: 5
- Registriert: 20.05.2011, 18:57
Re: Kommunikationsproblem mit ct'lab und ADA-IO Platine
Vielen Dank für deine Antwort!
Ich verwende keine Checksummen. Werde als Nächstes gleich mal nachschauen, wie ich die einschalte und damit arbeite
Das mit dem "kleinen" Puffer ist auch sehr interessant.
Ich habe testweise mal ein WaitForBytesWritten() in meinem Code ergänzt. Die Applikation friert dadurch ganz kurz ein aber die sporadischen Fehlsignale bleiben.
Hier mal Fragmente von meinem Code. Ich lese die Werte vom Port und schicke dann direkt eine große Datei ans ct'lab, in etwa so:
void myProgram::readPort(){
QByteArray data;
data = serial->readAll();
writePort();
}
void myProgram::writePort(){
QByteArray data;
data = "0:ALL0?";
data = data.append(CR);
data = data.append("0:VAL31?");
data = data.append(CR);
data = data.append(0:VAL20=0.5);
data = data.append(CR);
data = data.append(0:VAL31=6);
data = data.append(CR);
data = data.append(0:VAL30=160);
data = data.append(CR);
serial->write(data);
}
Alle 100 ms wird readPort aufgerufen. Ist das vielleicht der ganz falsche Ansatz?
Ich verwende keine Checksummen. Werde als Nächstes gleich mal nachschauen, wie ich die einschalte und damit arbeite
![Embarassed :oops:](./images/smilies/icon_redface.gif)
Das mit dem "kleinen" Puffer ist auch sehr interessant.
Ich habe testweise mal ein WaitForBytesWritten() in meinem Code ergänzt. Die Applikation friert dadurch ganz kurz ein aber die sporadischen Fehlsignale bleiben.
Hier mal Fragmente von meinem Code. Ich lese die Werte vom Port und schicke dann direkt eine große Datei ans ct'lab, in etwa so:
void myProgram::readPort(){
QByteArray data;
data = serial->readAll();
writePort();
}
void myProgram::writePort(){
QByteArray data;
data = "0:ALL0?";
data = data.append(CR);
data = data.append("0:VAL31?");
data = data.append(CR);
data = data.append(0:VAL20=0.5);
data = data.append(CR);
data = data.append(0:VAL31=6);
data = data.append(CR);
data = data.append(0:VAL30=160);
data = data.append(CR);
serial->write(data);
}
Alle 100 ms wird readPort aufgerufen. Ist das vielleicht der ganz falsche Ansatz?
Re: Kommunikationsproblem mit ct'lab und ADA-IO Platine
Wenn ich das richtig sehe, dann liest readPort die empfangenen Daten aus dem PC-Empfangspuffer ein und schickt dann die ganze Liste der Kommandos (sind so 50 Byte) auf einen Schwung raus, für die nächste Abfrage?Hans-Günther hat geschrieben:Alle 100 ms wird readPort aufgerufen. Ist das vielleicht der ganz falsche Ansatz?
Verhalten sich Pascal- und C-Firmware gleich?
Re: Kommunikationsproblem mit ct'lab und ADA-IO Platine
Ich würde die Kommandos nicht am "Stück" schicken, sondern einzeln.
Ich häng mal meine Pythonlib ran, da sollte sich ein Stückchen Code abschauen lassen...
Viele Grüße,
Bart
Ich häng mal meine Pythonlib ran, da sollte sich ein Stückchen Code abschauen lassen...
Viele Grüße,
Bart