mikrocontroller.net

Forum: PC-Programmierung Serielle Schnittstelle mittels QextSerialPort ansprechen


Autor: Eric (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
QString ComHandler::connect()
{
    port = new QextSerialPort("COM11", QextSerialPort::EventDriven);
    port->setBaudRate(BAUD9600);
    port->setFlowControl(FLOW_OFF);
    port->setParity(PAR_NONE);
    port->setDataBits(DATA_8);
    port->setStopBits(STOP_1);


    if(!(port->open(QIODevice::ReadWrite)) )
        return QString("Connection failed");
    else
        return QString("Connection up!");


Danke im voraus

Autor: Frankl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommt den etwas auf einem z.B. Hyperterminal an?

Autor: Gerry E. (micky01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eric schrieb:

> Connect Funktion:
>
QString ComHandler::connect()
> {
>     port = new QextSerialPort("COM11", QextSerialPort::EventDriven);
>     port->setBaudRate(BAUD9600);
>     port->setFlowControl(FLOW_OFF);
>     port->setParity(PAR_NONE);
>     port->setDataBits(DATA_8);
>     port->setStopBits(STOP_1);
> 
> 
>     if(!(port->open(QIODevice::ReadWrite)) )
>         return QString("Connection failed");
>     else
>         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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gerry E. (micky01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ui, das mit der 11 hab ich doch glatt übersehen...

Autor: Eric (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Eric (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
 char data[2]; //2Byte einlesen da (00000011 11111111)
    qDebug()<<("Data received:");
    int bytesRead = port->read(data, 9);
    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?
 char data[1024];

    int bytesRead = port->read(data, 1024);
    data[bytesRead] = '\0';
    qDebug()<<"bytesRead"<<bytesRead;
    qDebug()<<data;
    qDebug()<<bytesRead;

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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().

Autor: brott (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.