Qextserial Daten empfangen

Alles rund um die Programmierung mit Qt
Antworten
GGStefan
Beiträge: 22
Registriert: 31. August 2012 23:59
Wohnort: Brandenburg (LDS)

Qextserial Daten empfangen

Beitrag von GGStefan »

Hallo,

bin immer noch dabei ein Projekt zu erstellen um mit Hilfe Qextserial eine Relaiskarte von Conrad (Artikel-Nr.: 967720 - 14) steuern zu können. Habe es jetzt geschafft das ich mit meinem Test-Prog. Relais einschalten kann :D . Nun würde ich gerne den Status der Relais abfragen, ich empfange auch soweit ich das beurteilen kann 4 Byte über die RS232 jedoch entsprechen sie nicht dem was kommen sollte :?: . Ich habe keine Ahnung warum :cry: .

Hier noch der Auszug aus dem Handbuch zur Karte:

Features:
Protokoll (4 Byte Befehlsrahmen)
Kaskadierung der Relaisplatinen möglich
Kommunikation Über einfache Dreidrahtleitungen (TxD, RxD, Masse)
Baudrate 19200.

Auf jedes ausgeführte Kommando gibt der Relaisplatinen-
Controller eine Antwort.
Kommandos und Antworten bestehen jeweils aus einer Folge von 4 Bytes.
Diese nennen wir nachfolgend auch Rahmen oder Frame.
Rahmenaufbau:
Byte 0 Kommando
Byte 1 Platinenadresse
Byte 2 Daten
Byte 3 Prüfsumme (XOR)

In meinem Beispiel sollte nach dem senden von „2;1;0;3“ sollte bei eingeschaltetem Relais 1 als Antwort kommen „253;1;1;253“, es kommen aber völlig andere Werte.

Habe hoffentlich nichts wichtiges vergessen anzugeben. Habe das Projekt mit ran gehangen, sagt wahrscheinlich mehr als meine Ausführungen.

Gruß GGStefan
Dateianhänge
QextSerialAuflistung.tar.gz
Der Quelltext zum besseren Verständnis!
(41.93 KiB) 208-mal heruntergeladen
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Qextserial Daten empfangen

Beitrag von veeman »

1. Hast du die Jumper richtig konfiguriert?
2. Du führst keine Initialisierung durch > SETUP(1). Im Datenblatt geht nicht genau hervor ob das wirklich nötig ist, ggf soltlest du das durchfüren.
3. Andere Werte, und die wären? Vl. fürt die Karte den Schritt 2. automatisch durch und du kriegst zunächst diese Daten.

- QIODevice::Unbuffered wird bei QExtSerialport womöglich ignoriert.

Letzlich komme ich zu dieser Codestelle:

Code: Alles auswählen

port->write(transmitFrame, transmitFrame.length());
QByteArray receiveFrame;
int bytesAvailable = port->bytesAvailable();
Grundsätzlich kannst du davon ausgehen wenn der Backbuffer leer ist und du die obigen Operationen durchführst das bytesAvailable=0 ist,
aus dem einfachen Grund das dein PC einvielfaches schneller ist als die Kommunikation und allgemein deine Relaiskarte.
In dieser kurzen Zeit kriegst du keine Antwort von dem Board, dh. du musst warten bis die vorhanden sind.

Zum testen kannst du provisiorisch folgendes machen:

Code: Alles auswählen

// Eingangsbuffer leeren
port->readAll();
//Commando in voller laenge senden
port->write(transmitFrame);

//warten bis 4 bytes vorhanden sind (unschöne variante)
while (port->bytesAvailable() < 4);

// daten auslesen
QByteArray receiveFrame = port->readAll();

// ... daten verarbeiten
// Edit ggf. solltest du dir den SLOT QIODevice::readyRead() und das ganze asynchron verarbeiten.
GGStefan
Beiträge: 22
Registriert: 31. August 2012 23:59
Wohnort: Brandenburg (LDS)

Re: Qextserial Daten empfangen

Beitrag von GGStefan »

Hallo Veemann,

habe nicht erwähnt das die Verkabelung und Jumper richtig sind :oops: , habe sie mit einem Programm von Thomas Dohl (http://www.thomas-dohl.de) getestet und es funktioniert auch alles so wie es soll. Die Initialisierung ist Notwendig, diese habe ich ebenfalls mit dem Programm RCCP durchgeführt, parallel zu meinem GUI in einem Terminal. Ich gehe auch davon aus das so gehen sollte da ich ja die Relais einschalten kann über mein GUI :roll: . Bei anderen Werten meinte ich das die Antwort auf „2;1;0;3“ ist „-4;1;8;-11“ und beim nochmaligen betätigen des Buttons kommt „-4;1;8;-12“.

Bytes sollten vorhanden sein, den bytesAvailable liefert als Antwort immer 4 Bytes.

Deinen Vorschlag mit den Änderungen werde ich gleich Morgen probieren und mich wieder melden.

Noch eine Frage :?: Was ist der Backbuffer?

An die Sache mit dem Slot wollte ich mich noch ran machen wenn ich Überhaupt irgendeine Kommunikation hin bekommen habe. Im Grund will ich nur beim anklicken eines Buttons ein bestimmtes Relais ein/aus-schalten, dazu benötige ich ja auch den Status der Relais. Sonst könnte ich immer nur eines einschalten und müsste ja immer alle ausschalten.

Vielen Dank für deine Antwort und Hilfe!

Gruß Stefan
GGStefan
Beiträge: 22
Registriert: 31. August 2012 23:59
Wohnort: Brandenburg (LDS)

Re: Qextserial Daten empfangen

Beitrag von GGStefan »

Hallo Veemann,

habe den Vorschlag getestet, leider ist das Ergebnis mehr oder weniger das gleiche :cry: . Auf das senden von „2;1;0;3“ erhalte ich jetzt „-4;1;8;-11“ und beim zweiten senden von „2;1;0;3“ die Antwort von „-3;1;8;-12“ und das ist nicht einmal mit viel Fantasie das was hätte kommen müssen.

Bin wirklich ein wenig ratlos :? !

Gruß Stefan
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Qextserial Daten empfangen

Beitrag von veeman »

Interpretier mal die Empfangenen Werte als unsigned char, momentan liest du diese als char aus und dies ist Vorzeichenbehaftet.
Demnach sollte „-4;1;8;-11“ -> "252,1,8,245" entsprechen und das sollte dass sein was du möchtest.

Code: Alles auswählen

ui->label_10->setNum((unsigned char)receiveFrame[0]);
GGStefan
Beiträge: 22
Registriert: 31. August 2012 23:59
Wohnort: Brandenburg (LDS)

Re: Qextserial Daten empfangen

Beitrag von GGStefan »

Hallo Veemann,

das mit „unsigned char“ war ein guter Hinweis :lol: , jetzt geht es zwar noch nicht richtig, jedoch sind die angezeigten Werte jetzt deutlich sinnvoller. Das einzige was jetzt passiert ist das ich beim ersten „lesen“ die Werte vom letzten Befehl „3;1;10;8“ angezeigt bekomme „252;1;10;247“, was auch stimmt was Prüfsumme und so angeht. Beim zweiten clicken auf den Button „lesen“ bekomme ich dann die Antwort auf den Befehl „2;1;0;3“ von „253;1;10;246“ was wiederum stimmt. Habe schon einiges probiert um es beim ersten „lesen“ hinzu bekommen jedoch ohne Erfolg :roll: .

Habe zum besseren Verständnis die Dateien mit den Änderungen angehängt!
Dateianhänge
QextSerialAuflistung.tar.gz
Neue Dateien
(42.17 KiB) 199-mal heruntergeladen
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Qextserial Daten empfangen

Beitrag von veeman »

Der Backbuffer (Doppelpufferung/Hintergrundpuffer oder einfach nur Puffer/Buffer) ist ein Zwischenspeicher der alle eingehenden Daten die von einem System gesendet werden Speichert. Da die eingehenden Daten kontinuierlich rein kommen und normalerweise auch sofort verarbeitet werden müssen werden diese automatisch von QExtSerialport ausgelesen und in diesen Buffer gespeichert. Deine Anwendung kann nun diese zwischengespeicherte Daten mittels read bzw. readAll dann auslesen.

Wenn du nun nach dem Verbinden mittels write Daten ans Board sendest, kriegst du auch eine Antwort darauf zurück die Zwischengespeichert wird, jedoch wenn du direkt nach dem write, readAll durchführst sind noch keine Daten vorhanden, von daher kriegst du beim Auslesen mittels des Buttons noch die alte zwischengespeicherte Daten zurück.

Um dieses Problem zu lösen gibt es mehrere Möglichkeiten, es wäre vl. jetzt sinnvoll mit readyRead zu arbeiten.
GGStefan
Beiträge: 22
Registriert: 31. August 2012 23:59
Wohnort: Brandenburg (LDS)

Re: Qextserial Daten empfangen

Beitrag von GGStefan »

Hallo veemann,

werde mich damit bei Gelegenheit auseinander setzen, habe gerade beruflich etwas Stress.

Gruß GGStefan
Antworten