mikrocontroller.net

Forum: PC-Programmierung Qt : Problem mit Qextserialport


Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leutz

Ich bin der Verzweifelung nahe, denn ich komme einfach nicht darauf 
welchen Fehler ich mache.
Umgebung:
Windows XP aktuelle Updatepacks
Qt Creator mit allen aktuellen updates und Qextserialport 1.2
Mit folgendem Code versuche ich deinen Seriellen Anschluss abzufragen.
#include <serialport.h>
//******************************************************************************
SerialPort::SerialPort(QWidget *parent)
{
   erg=0;
   timerPort=new QTimer(this);
   connect(timerPort, SIGNAL(timeout()), this, SLOT(fetchData()));
   serialPort = new QextSerialPort();
}
//******************************************************************************
void SerialPort::changeParas(QString &name, PortSettings &para)
{
   serialPort->setPortName(name);
   serialPort->setBaudRate(para.BaudRate);   
   serialPort->setFlowControl(FLOW_OFF);
   serialPort->setParity(PAR_NONE);
   serialPort->setDataBits(DATA_8);
   serialPort->setStopBits(STOP_1);
}
//******************************************************************************
void SerialPort::openPort()
{
   serialPort->open(QIODevice::ReadWrite);
   timerPort->start(30);
   emit(portOpened());
}
//******************************************************************************
void SerialPort::closePort()
{
   serialPort->close();
   timerPort->stop();
   emit(portClosed());
}
//******************************************************************************
void SerialPort::fetchData(void)
{
  char buff[1024];
  int numBytes;
  erg++;
  numBytes = serialPort->bytesAvailable();
  
  if(numBytes > 0) 
  {
    if(numBytes > 1024) numBytes = 1024;
    while(serialPort->bytesAvailable()>12){     //readLine macht nicht exklusiv beim \n Stopp
      serialPort->readLine(buff, numBytes);
      QString msg = buff;
      erg++;
      if(msg=="t"){
      erg++;
      }
     }
  }
  emit(dataReady());
}
//******************************************************************************
double SerialPort::giveValue()
{
        return erg;
}


//******************************************************************************
void SerialPort::clearerg()
{
    erg=0;
}

//******************************************************************************
void SerialPort::sendData(QByteArray befehl)
{
  if(serialPort->isOpen()){
    serialPort->write(befehl, 1);   //Steuerung soll nur ein Char sein
  }
}
//******************************************************************************

Das Problem ist nun, dass offenbar auf den Port richtig verbunden wird ( 
per Hterm kann ich ihn nicht mehr ansprechen).
Allerdings wird fetchData offensichtlich nicht aufgerufen, denn im 
Hauptprogramm, welches erg mit givevalue() abruft und anzeigt wird der 
Wert nicht erhöht.

Irgendwas mache ich falsch. Wenn ich die Value erg im giveValue erhöhe 
funktioniert es aber weder das if in FetchData noch das erg++ davor 
scheint zu funktionieren, obwohl der Timer beim timeout doch eigentlich 
FetchData aufrufen sollte.

mfg Jan

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welches Hauptprogramm?
Welches serialport.h?

Wird openPort() irgendwo auch aufgerufen (sonst wird der Timer nicht 
gestartet)?

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So hier nochmal die serialport header Datei
#ifndef SERIALPORT_H
#define SERIALPORT_H

#include <qextserialport.h>
#include <QTimer.h>

class SerialPort  : public QextSerialPort
 {
     Q_OBJECT
  private:
    QextSerialPort* serialPort;
    QTimer *timerPort;
    double erg;
  public:
    SerialPort(QWidget *parent = 0);
    void changeParas(QString &name, PortSettings &para);    
    double giveValue(void);
    void sendData(QByteArray befehl);
    void clearerg(void);
  private slots:
    void fetchData(void);
  public slots:
    void openPort();
    void closePort();
  signals:
  void portOpened();
  void portClosed();
  void dataReady();
 };

#endif

Hier die Mainwindow funktion welche die Port Klasse erstellt

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
ui->setupUi(this);
timerLCD=new QTimer(this);
timerZZP=new QTimer(this);
timerRPM=new QTimer(this);
port=new SerialPort();

verbunden = "Verbindung wurde hergestellt";
getrennt = "Verbindung wurde getrennt";

connect(timerLCD, SIGNAL(timeout()), this, SLOT(updatedrehzahl_LCD()));
connect(timerZZP, SIGNAL(timeout()), this, SLOT(updatezzp_LCD()));
connect(timerZZP, SIGNAL(timeout()), this, SLOT(updatevorz_LCD()));
connect(timerRPM, SIGNAL(timeout()), this, SLOT(drehzahl()));

connect(ui->pushButtonTrennen, SIGNAL(clicked(bool)), this, SLOT(trennenButtonClicked()));
connect(ui->pushButtonVerbinden, SIGNAL(clicked(bool)), this, SLOT(verbindenButtonClicked()));
connect(ui->spinBox, SIGNAL(valueChanged(int)), this, SLOT(maxdrehzahl()));

connect(port, SIGNAL(portOpened()), this, SLOT(connected()));
connect(port, SIGNAL(portClosed()), this, SLOT(disconnected()));

maxrpm=ui->spinBox->value()+100;

ui->progressBar->setMaximum(maxrpm);
ui->progressBar->setMinimum(0);
ui->statusBar->showMessage(getrennt);
}

Hier die Funktion verbindenButtonClicked
void MainWindow::verbindenButtonClicked(void)
{
ui->drehzahlLCD->display(rpm);
ui->progressBar->setValue(rpm);
timerRPM->start(100);
timerLCD->start(13);
timerZZP->start(500);
port->closePort();

PortSettings para;
QString name;
name=ui->comboBox->currentText();

switch(ui->comboBox_2->currentIndex())
     {
             case 0:
                     para.BaudRate=(BAUD300);
                     break;
             case 1:
                     para.BaudRate=(BAUD600);
                     break;
             case 2:
                     para.BaudRate=(BAUD1200);
                     break;
             case 3:
                     para.BaudRate=(BAUD2400);
                     break;
             case 4:
                     para.BaudRate=(BAUD4800);
                     break;
             case 5:
                     para.BaudRate=(BAUD9600);
                     break;
             case 6:
                     para.BaudRate=(BAUD14400);
                     break;
             case 7:
                     para.BaudRate=(BAUD19200);
                     break;
             case 8:
                     para.BaudRate=(BAUD38400);
                     break;
             case 9:
                     para.BaudRate=(BAUD56000);
                     break;
             case 10:
                     para.BaudRate=(BAUD57600);
                     break;
             case 11:
                     para.BaudRate=(BAUD76800);
                     break;
             case 12:
                     para.BaudRate=(BAUD115200);
                     break;
             case 13:
                     para.BaudRate=(BAUD128000);
                     break;
             case 14:
                     para.BaudRate=(BAUD256000);
     }

    para.Timeout_Millisec=100;
//  para.Timeout_Sec=0;
    port->changeParas(name, para);

port->openPort();
}

Autor: Auch_nur_Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre es nicht um einiges einfacher, wenn Du das ganze Projekt in ein 
Archiv packst und mit hochlädst? Einschließlich der von Dir verwendeten 
QExtSerialPort - Komponente? Schon die mitgelieferten Beispiele 
ausprobiert und funktionieren?

Wenn Du meinst, es liegt an QExtSerialPort, dann schaue hier: 
http://code.google.com/p/qextserialport/

Unter http://qtforum.de/forum/ finden sich auch einige Beiträge zur 
(seriellen) Kommunikation.

mfG,
Auch_nur_Gast

Autor: kuzulis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Or use QSerialDevice

http://fireforge.net/projects/qserialdevice/

PS:
best use from svn:
 svn checkout svn://scm.fireforge.net/svnroot/qserialdevice

Autor: Frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
wo muss ich den im Projekt einstellen, welches OS ich habe? Wenn ich das 
Unter Windows compiliere, also die qext Klasse meldet er Fehler bei den 
POSIX Dateien.

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.