Qt : Problem mit Qextserialport

Gast #1639374
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
1
Mit folgendem Code versuche ich deinen Seriellen Anschluss abzufragen.
2
#include <serialport.h>
3
//******************************************************************************
4
SerialPort::SerialPort(QWidget *parent)
5
{
6
   erg=0;
7
   timerPort=new QTimer(this);
8
   connect(timerPort, SIGNAL(timeout()), this, SLOT(fetchData()));
9
   serialPort = new QextSerialPort();
10
}
11
//******************************************************************************
12
void SerialPort::changeParas(QString &name, PortSettings &para)
13
{
14
   serialPort->setPortName(name);
15
   serialPort->setBaudRate(para.BaudRate);   
16
   serialPort->setFlowControl(FLOW_OFF);
17
   serialPort->setParity(PAR_NONE);
18
   serialPort->setDataBits(DATA_8);
19
   serialPort->setStopBits(STOP_1);
20
}
21
//******************************************************************************
22
void SerialPort::openPort()
23
{
24
   serialPort->open(QIODevice::ReadWrite);
25
   timerPort->start(30);
26
   emit(portOpened());
27
}
28
//******************************************************************************
29
void SerialPort::closePort()
30
{
31
   serialPort->close();
32
   timerPort->stop();
33
   emit(portClosed());
34
}
35
//******************************************************************************
36
void SerialPort::fetchData(void)
37
{
38
  char buff[1024];
39
  int numBytes;
40
  erg++;
41
  numBytes = serialPort->bytesAvailable();
42
  
43
  if(numBytes > 0) 
44
  {
45
    if(numBytes > 1024) numBytes = 1024;
46
    while(serialPort->bytesAvailable()>12){     //readLine macht nicht exklusiv beim \n Stopp
47
      serialPort->readLine(buff, numBytes);
48
      QString msg = buff;
49
      erg++;
50
      if(msg=="t"){
51
      erg++;
52
      }
53
     }
54
  }
55
  emit(dataReady());
56
}
57
//******************************************************************************
58
double SerialPort::giveValue()
59
{
60
        return erg;
61
}
62

63

64
//******************************************************************************
65
void SerialPort::clearerg()
66
{
67
    erg=0;
68
}
69

70
//******************************************************************************
71
void SerialPort::sendData(QByteArray befehl)
72
{
73
  if(serialPort->isOpen()){
74
    serialPort->write(befehl, 1);   //Steuerung soll nur ein Char sein
75
  }
76
}
77
//******************************************************************************

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
Gast
So hier nochmal die serialport header Datei
1
#ifndef SERIALPORT_H
2
#define SERIALPORT_H
3

4
#include <qextserialport.h>
5
#include <QTimer.h>
6

7
class SerialPort  : public QextSerialPort
8
 {
9
     Q_OBJECT
10
  private:
11
    QextSerialPort* serialPort;
12
    QTimer *timerPort;
13
    double erg;
14
  public:
15
    SerialPort(QWidget *parent = 0);
16
    void changeParas(QString &name, PortSettings &para);    
17
    double giveValue(void);
18
    void sendData(QByteArray befehl);
19
    void clearerg(void);
20
  private slots:
21
    void fetchData(void);
22
  public slots:
23
    void openPort();
24
    void closePort();
25
  signals:
26
  void portOpened();
27
  void portClosed();
28
  void dataReady();
29
 };
30

31
#endif

Hier die Mainwindow funktion welche die Port Klasse erstellt
1
MainWindow::MainWindow(QWidget *parent) :
2
    QMainWindow(parent),
3
    ui(new Ui::MainWindow)
4
{
5
ui->setupUi(this);
6
timerLCD=new QTimer(this);
7
timerZZP=new QTimer(this);
8
timerRPM=new QTimer(this);
9
port=new SerialPort();
10

11
verbunden = "Verbindung wurde hergestellt";
12
getrennt = "Verbindung wurde getrennt";
13

14
connect(timerLCD, SIGNAL(timeout()), this, SLOT(updatedrehzahl_LCD()));
15
connect(timerZZP, SIGNAL(timeout()), this, SLOT(updatezzp_LCD()));
16
connect(timerZZP, SIGNAL(timeout()), this, SLOT(updatevorz_LCD()));
17
connect(timerRPM, SIGNAL(timeout()), this, SLOT(drehzahl()));
18

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

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

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

28
ui->progressBar->setMaximum(maxrpm);
29
ui->progressBar->setMinimum(0);
30
ui->statusBar->showMessage(getrennt);
31
}

Hier die Funktion verbindenButtonClicked
1
void MainWindow::verbindenButtonClicked(void)
2
{
3
ui->drehzahlLCD->display(rpm);
4
ui->progressBar->setValue(rpm);
5
timerRPM->start(100);
6
timerLCD->start(13);
7
timerZZP->start(500);
8
port->closePort();
9

10
PortSettings para;
11
QString name;
12
name=ui->comboBox->currentText();
13

14
switch(ui->comboBox_2->currentIndex())
15
     {
16
             case 0:
17
                     para.BaudRate=(BAUD300);
18
                     break;
19
             case 1:
20
                     para.BaudRate=(BAUD600);
21
                     break;
22
             case 2:
23
                     para.BaudRate=(BAUD1200);
24
                     break;
25
             case 3:
26
                     para.BaudRate=(BAUD2400);
27
                     break;
28
             case 4:
29
                     para.BaudRate=(BAUD4800);
30
                     break;
31
             case 5:
32
                     para.BaudRate=(BAUD9600);
33
                     break;
34
             case 6:
35
                     para.BaudRate=(BAUD14400);
36
                     break;
37
             case 7:
38
                     para.BaudRate=(BAUD19200);
39
                     break;
40
             case 8:
41
                     para.BaudRate=(BAUD38400);
42
                     break;
43
             case 9:
44
                     para.BaudRate=(BAUD56000);
45
                     break;
46
             case 10:
47
                     para.BaudRate=(BAUD57600);
48
                     break;
49
             case 11:
50
                     para.BaudRate=(BAUD76800);
51
                     break;
52
             case 12:
53
                     para.BaudRate=(BAUD115200);
54
                     break;
55
             case 13:
56
                     para.BaudRate=(BAUD128000);
57
                     break;
58
             case 14:
59
                     para.BaudRate=(BAUD256000);
60
     }
61

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

66
port->openPort();
67
}
Gast
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
Gast
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.