Forum: PC-Programmierung Qt : Problem mit Qextserialport


von Jan (Gast)


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

von Klaus W. (mfgkw)


Lesenswert?

Welches Hauptprogramm?
Welches serialport.h?

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

von Jan (Gast)


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
}

von Auch_nur_Gast (Gast)


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

von kuzulis (Gast)


Lesenswert?

Or use QSerialDevice

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

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

von Frage (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.