Qt : Problem mit Qextserialport

Gast #1639374
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
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 #1639416
Lesenswert?

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 #1640232
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

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