Serielle Schnittstelle mittels QextSerialPort ansprechen

Gast #1629204
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
#1629421
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.
Persönliche Seite #1629467
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.
Gast #1630571
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
#1630582
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.
Gast #1630648
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;
Gast #1631730
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().
Gast #1632027
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren