von
Jan (Gast)
17.03.2010 22:29
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
Welches Hauptprogramm?
Welches serialport.h?
Wird openPort() irgendwo auch aufgerufen (sonst wird der Timer nicht
gestartet)?
von
Jan (Gast)
17.03.2010 23:08
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)
18.03.2010 16:07
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)
19.03.2010 12:55
Or use QSerialDevice
http://fireforge.net/projects/qserialdevice/
PS:
best use from svn:
svn checkout svn://scm.fireforge.net/svnroot/qserialdevice
von
Frage (Gast)
24.03.2010 19:23
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.