Forum: PC-Programmierung Serielle Schnittstelle mittels QextSerialPort ansprechen


von Eric (Gast)


Lesenswert?

Hi!

Derzeit versuche ich mit meinem Qt-Programm Daten von meinem µC 
einzulesen und dann graphisch auszugeben.

Verwendet wird derzeit:
-------------------------
Atmega 16 mit Max232 (auf einer Entwicklungsplatine)
Lindy RS232 zu USB converter-Kabel
QextSerialPort zum Verbindungsaufbau
QWT für die graphische Ausgabe

Probleme:
-------------
Vom µC bekommen ich AD-gewandelte Daten in 10 bit und sollte diese 
direktin einem Graphen angeben und abspeichern. Wie mache ich das am 
besten? Mit einem Thread?
Ich kann mich nicht mit dem µC verbinden obwohl ich mir eig. ziemlich 
sicher bin, dass der Code richtig ist. Kann dies am Converter-Kabel 
liegen? Sollte hoffentlich bald das TTL232-5V bekommen vieleicht 
funktionierts ja damit.

Connect Funktion:
1
QString ComHandler::connect()
2
{
3
    port = new QextSerialPort("COM11", QextSerialPort::EventDriven);
4
    port->setBaudRate(BAUD9600);
5
    port->setFlowControl(FLOW_OFF);
6
    port->setParity(PAR_NONE);
7
    port->setDataBits(DATA_8);
8
    port->setStopBits(STOP_1);
9
10
11
    if(!(port->open(QIODevice::ReadWrite)) )
12
        return QString("Connection failed");
13
    else
14
        return QString("Connection up!");


Danke im voraus

von Frankl (Gast)


Lesenswert?

Kommt den etwas auf einem z.B. Hyperterminal an?

von Gerry E. (micky01)


Lesenswert?

Eric schrieb:

> Connect Funktion:
>
1
QString ComHandler::connect()
2
> {
3
>     port = new QextSerialPort("COM11", QextSerialPort::EventDriven);
4
>     port->setBaudRate(BAUD9600);
5
>     port->setFlowControl(FLOW_OFF);
6
>     port->setParity(PAR_NONE);
7
>     port->setDataBits(DATA_8);
8
>     port->setStopBits(STOP_1);
9
> 
10
> 
11
>     if(!(port->open(QIODevice::ReadWrite)) )
12
>         return QString("Connection failed");
13
>     else
14
>         return QString("Connection up!");
>


Ich nehme an es kommt "Connection failed".
Dann prüfe doch mal zuerst, ob Du Zugriffsrechte auf den Port hast.
Mach Dich zum Mitglied der Gruppe uucp oder so.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Kümmert sich denn QextSerialPort um die korrekte Syntax der 
Devicenamen?

Sieh mal im Quelltext/Debugger nach, welches Argument von 
QextSerialPort::open an die Win32-API-Funktion CreateFile übergeben 
wird.

Um serielle Schnittstellen mit Nummern größer als 9 öffnen zu können, 
muss an CreateFile nicht "COM10" sondern "\\.\COM10" übergeben werden.

Wenn QextSerialPort von jemandem portiert wurde, der sich mit Win32 
auskennt, dann kümmert es sich um derlei Dinge.

Wenn nicht, dann musst Du das selber übernehmen.

von Gerry E. (micky01)


Lesenswert?

Ui, das mit der 11 hab ich doch glatt übersehen...

von Eric (Gast)


Lesenswert?

Danke mal für all die schnellen Antworten!
Hab mal bisschen rumprobiert unnd es war wirklich das Problem mit 
"COM11".
Connection funktioniert.

Nun vieleicht noch zu meiner nächsten Frage: Ich bekomme die Daten vom 
µC in jeweils 2 byte vom ADC (zb.: 00000011 11111111). Diese würde ich 
gern einlesen und zeitgleich einem QWT-Plot anzeigen. Muss das einlesen 
nun als Thread laufen oder sollte ich direkt in ein File schreiben und 
vom Graphen wieder auslesen?

lg Eric

von Mark B. (markbrandis)


Lesenswert?

Eric schrieb:
> Nun vieleicht noch zu meiner nächsten Frage: Ich bekomme die Daten vom
> µC in jeweils 2 byte vom ADC (zb.: 00000011 11111111). Diese würde ich
> gern einlesen und zeitgleich einem QWT-Plot anzeigen. Muss das einlesen
> nun als Thread laufen oder sollte ich direkt in ein File schreiben und
> vom Graphen wieder auslesen?

In eine Datei schreiben würde ich die Daten nur, wenn ich sie dauerhaft 
speichern will :-) Ach so, willst Du ja - lesen sollt ma können ;-)

Wenn Du eh schon Qt hast, kannst Du dann nicht etwas mit Signals und 
Slots basteln? Kann man ein Signal erzeugen (lassen), wenn Daten über 
die serielle Schnittstelle empfangen werden? Wenn ja, dann verbinde 
dieses Signal doch einfach mit einem Slot der Zeichenklasse, die die 
Grafik neu zeichnet. Ein unsigned int als Übergabewert reicht ja locker 
für Deine 10 Bit an Nutzdaten.

von Eric (Gast)


Lesenswert?

ja gibts das nennt sich "readyRead()" kommt auch von der QextSerialPort 
Library. Nun mein Problem ist das einlesen. Es kommen permanent Daten 
vom µC das würde ja heißen er kommt nie wieder aus der Funktion raus 
oder? Die Daten vom µC kommen immer 8Bit dann 1 Stop-Bit könnte dann 
meine Funktion so ausehen?
1
 char data[2]; //2Byte einlesen da (00000011 11111111)
2
    qDebug()<<("Data received:");
3
    int bytesRead = port->read(data, 9);
4
    qDebug()<<data;

oder lese ich gleich mehr Byte ein, aber dann muss ich ja warten bis die 
alle gelesen werden bevor ich die anzeige und bricht das programm dann 
nach 1024 Byte das lesen ab? Wird das Signal "readReady()" bei jedem 
einkommenden Byte ausgelöst oder nur einmal?
1
 char data[1024];
2
3
    int bytesRead = port->read(data, 1024);
4
    data[bytesRead] = '\0';
5
    qDebug()<<"bytesRead"<<bytesRead;
6
    qDebug()<<data;
7
    qDebug()<<bytesRead;

von Rolf Magnus (Gast)


Lesenswert?

Eric schrieb:

> ja gibts das nennt sich "readyRead()" kommt auch von der QextSerialPort
> Library. Nun mein Problem ist das einlesen. Es kommen permanent Daten
> vom µC das würde ja heißen er kommt nie wieder aus der Funktion raus
> oder?

Na so schnell kommen die Daten von einer seriellen Schnittstelle nun 
auch wieder nicht.

> oder lese ich gleich mehr Byte ein, aber dann muss ich ja warten bis die
> alle gelesen werden bevor ich die anzeige und bricht das programm dann
> nach 1024 Byte das lesen ab?

Du liest in readyRead() einfach soviel, wie gerade verfügbar ist, nicht 
mehr und nicht weniger. Dazu gibt's die Funktion bytesAavailable().

von brott (Gast)


Lesenswert?

die isAvailable() abfrage funktioniert nicht so richtig - zumindest gibt 
kein signal.

Also entweder einen Thread schreiben, der den Dateneingang abfragt und 
dort ein signal definieren
Oder einen Timer nutzen und in entsprechenden zyklen abfragen.

von chris (Gast)


Lesenswert?

Am besten ist es, ein Beispielprogramm zu verwenden. In diesem Artikel 
gibt es einen Link auf ein qt-programm so wie Du es haben willst:

http://starlino.com/imu_kalman_arduino.html

Willst Du Dein Projekt Open Source machen?

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.