Forum: PC-Programmierung QT - serielle Schnittstelle


von Phönix89 (Gast)


Lesenswert?

Hallo Leute,

ich schicke von einem Atmega32 mit rund 500Hz jeweils 6Byte über einen 
FT232 zum PC.

Der Code am PC sieht so aus:
1
[...]
2
connect(serial,SIGNAL(readyRead()), this, SLOT(serial_read_data()));
3
[...]
4
void w_Messbox::serial_read_data(){
5
    serial->blockSignals(1);
6
7
    read_data.insert(0,serial->read(6));
8
9
    ui->LCD_PortA7->display(static_cast<double>(serial->bytesAvailable()));
10
    serial->blockSignals(0);
11
}

Das Ding macht nichts anderes, als besagte 6Byte zu lesen und die Anzahl 
der Bytes anzuzeigen. Problem: Die Anzahl der Bytes wird immer größer 
und größer.. der PC kommt einfach nicht hinterher, aber ich mach doch 
fast nichts?

Jemand eine Idee, welchen (blöden) Fehler ich mache?

von Rolf M. (rmagnus)


Lesenswert?

Woher weißt du denn, daß in serial_read_data genau 6 Bytes verfügbar 
sind? Du liest einfach genau 6 Bytes, ohne zu wissen, wieviel 
tatsächlich da ist.
Und warum blockierst du die Signale der seriellen Schnittstelle?

von Phoenix89 (Gast)


Lesenswert?

Das mit den 6 Byte klappt erstmal, wenn es da nochn Problem gibt, dann 
schau ich mir das dann an :)

Mit dem Blockieren der Schnittstelle wollte ich sicherstellen, dass er 
das nicht (warum auch immer) nen zweites Mal während er da drinne ist 
aufruft.

Problem besteht jedenfalls auch noch, wenn ich die wegnehme..

von Phoenix89 (Gast)


Lesenswert?

Ich hab mich nochmal (versucht^^) schlauer zu machen.
Auf der QT-Seite steht in einem dezenten Nebensatz, dass es wohl 
ziemlich lange dauert, so einen Zugriff zu machen. Ich probiers mal mit 
einem größeren Buffer und meld mich Morgen nochmal :)

von Karl H. (kbuchegg)


Lesenswert?

Phoenix89 schrieb:
> Das mit den 6 Byte klappt erstmal, wenn es da nochn Problem gibt, dann
> schau ich mir das dann an :)

Es ist trotzdem keine gute Idee.

Man macht das immer so, dass man das ausliest was da ist. Die Aufteilung 
in die entsprechenden Messages (die hoffentlich durch ein Protokoll 
erkennbar ist) macht man dann im Programm selber.
Das kann bedeuten, dass man mit einem Aufruf von serial_read_data nur 
einen Teil der Bytes vom AVR bekommt, die man dann eben 
zwischenspeichern muss bis alles beisammen ist. Oder es kann auch 
bedeuten, dass mit einem Aufruf von serial_read_data auf einen Schlag 20 
Bytes von der Seriellen reinkommen, die dann eben in die entsprechende 
Anzahl an Nachrichten zerlegt werden muss und auf die reagiert werden 
muss. Und es können natürlch auch wieder ein paar Bytes übrig bleiben, 
die zwischengespeichert werden und dann erst zusammen mit den nächsten 
Bytes aus dem nächsten Aufruf von serial_read_data eine komplette 
Nachricht ergeben. Aber dieses Beharren auf "Da müssen jetzt 6 Bytes 
daher kommen" ist nur ein 'ask for troubles'

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.