Salut je suis sur un programme qui doit aussi lire et écrire sur un port série.
J'ai utiliser une classe que j'ai trouvé sur internet, (qui utilise termios.h)je sais plus ou...
La classe marche très bien par contre j'ai trois problèmes:

-Mon Timer me plante le programme une fois le Signal "timeout" enclencher
je ne sais pas pourquoi. Je l'utilise a la base pour scruter toutes les seconde mon port.

-Mes Slots ne fonctionne pas.
je voudrai que le texte éditer dans un QLineEdit soit envoyer sur le port série dés que j'appuie sur la touche entré.
Et que se même texte soit envoyer sur mon QTextEdit précéder de "envoie:" et que ce que je reçois soit écrit aussi

-Je voudrai accèdes a des méthodes d'un objet d'une autres classe mais je n'y arrive pas commen faire

Le code en commentaire est celui qui foire.
Si vous avez des idées.

voici mon code :
Le main:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
#include <QApplication>
#include "krs232.h"
#include "envoie.h"
#include <QPushButton>
#include <QLabel>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QLabel>
#include <QTextEdit>
#include <QTimer>
 
int main(int argc, char *argv[])
{
	Q_INIT_RESOURCE(application);
	QApplication app(argc, argv);
	QWidget fenetre;
 
 
	QLabel *envoyer = new QLabel("Envoyer");
	QPushButton *quitter = new QPushButton("Quitter");
	QLabel *rs232 = new QLabel("Reception:");
	Envoie *envoie = new Envoie;
	QTextEdit *carrecu =new QTextEdit;
 
	QTimer *timer = new QTimer;
 
 
 
	QGridLayout *layout = new QGridLayout;
 
	layout->addWidget(envoyer,0,0);
	layout->addWidget(envoie,0,1);
	layout->addWidget(rs232,1,0);
	layout->addWidget(carrecu,1,1);
	layout->addWidget(quitter,2,1);
 
	fenetre.setLayout(layout);
 
	//carrecu->setText("mache ok");
        KRs232 * Test = new KRs232();
 
	//Evenement bouton & reception:
 
	QObject::connect(quitter, SIGNAL(clicked()), qApp, SLOT(quit()));
    	QObject::connect(envoie, SIGNAL(returnPressed()),envoie, SLOT(renvoiemessage()));
	//QObject::connect(envoie, SIGNAL(returnTheText(char)),Test, SLOT (setText(char)))
 
  	//QObject::connect(envoie, SIGNAL(returnPressed ()),envoie, SLOT(clear()));
 
	//Problème mon timer bloque mon programme dès qu'il y a un timeout 
	//QObject::connect(timer, SIGNAL(timeout()),Test, SLOT(update()));
 
	timer->start(1000);
	fenetre.show();
 
	return app.exec();
}

le .h de la classe krs232
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
 
#include <iostream>
 
#ifndef KRS232_H
#define KRS232_H
 
//----------------------------------------------------------------------------
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <string.h>
//#include <time.h>
#include <sys/time.h>
 
//----------------------------------------------------------------------------
#define COM1	"/dev/ttyS0"
#define COM2	"/dev/ttyS1"
#define USB0 	"/dev/ttyUSB0"
 
//----------------------------------------------------------------------------
#define BPS9600  0
#define BPS4800  1
#define BPS2400  2
#define BPS19200 3
 
//----------------------------------------------------------------------------
#define BIT8	0
#define BIT7	1
#define BIT6	2
#define BIT5	3
 
//----------------------------------------------------------------------------
#define STOP1	0
#define STOP2	1
 
//----------------------------------------------------------------------------
#define PAS_DE_PARITE  0
#define PARITE_PAIRE	  1
#define PARITE_IMPAIRE 2
//----------------------------------------------------------------------------
#define AVEC_FINAL	0
#define SANS_FINAL	1
 
//----------------------------------------------------------------------------
#define	AVEC_TIME_OUT	true
#define	SANS_TIME_OUT	false
 
//----------------------------------------------------------------------------
#define OK		0
#define ERREUR 		-1
#define TIMEOUT		-2
#define RIEN_RECU	1
 
//---------------------------------------------------------------------------
 
#include <QMainWindow>
#include <QCloseEvent>
#include <QObject>
using namespace std;
 
class QAction;
class QMenu;
class QTextEdit;
class QLineEdit;
class QTextEdit;
 
class KRs232:public QObject
{
      Q_OBJECT
 
public:
	KRs232(void);
	KRs232(char* pPort,int Vitesse,int NbBits,int Parite,int NbStop);
	~KRs232();
 
	void AfficherMessageConfigurer();
 
	// Envoyer une chaine de caract�e
	int Envoyer(char* pChaine);
 
	// Recevoir Nb caract�es
	int Recevoir(int Nb,char* pChaine);
 
	// Recevoir une cha�e se terminant par un caract�donne
 
	// avec ou sans time out
	int Recevoir(char Fin, char* pChaine, int Mode);
	int Recevoir(char Fin, char* pChaine,int Mode, int Attente);
 
	// Recevoir une s�ie de caract�es avec time out
	int RecevoirCaractere(char* Caractere, int Attente);
 
	// Recevoir un fichier
	int RecevoirFichier(char *NomFichier, int AttenteDebut);
 
protected:
	int fd;	//Descripteur de fichier
	//char reception;//message reçu
 
private slots:
	void setText(char *a);
	void update();
private:
	termios Config;
	char MessageConfigurer[30];
	char *textenvoyer;
	int Configurer(char* pPort,int Vitesse,int NbBits,int Parite,int NbStop);
 
 
};
 
#endif
Le .cpp de la classe kr232
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
 
KRs232::KRs232(void)
{
	Configurer(USB0,BPS9600,BIT7,PAS_DE_PARITE,STOP1);	
}
 
KRs232::KRs232(char* pPort,int Vitesse,int NbBits,int Parite,int NbStop)
{
	Configurer(pPort,Vitesse,NbBits,Parite,NbStop);
}
 
int KRs232::Configurer(char* pPort,int Vitesse,int NbBits,int Parite,int NbStop)
{
	int Res;
	//Ouverture de la com.
	fd = open(pPort,O_RDWR | O_NONBLOCK);
 
	if (fd == -1)
	{
   		//fprintf(stderr,"Erreur lors de l'ouverture de %s\n",pPort);
		strcpy(MessageConfigurer, "Erreur lors de l'ouverture du port !");
	   	exit (-1);
   	}
	else
	{
		strcpy(MessageConfigurer, "Ouverture du port reussie.");
		// Suppression de l'echo
		Config.c_lflag &= ~(ECHO) ;
 
		Config.c_iflag = IGNBRK | IGNPAR;
		Config.c_oflag = 0;
		//Config.c_cflag = CREAD | CLOCAL; 18 01 2007
		Config.c_cflag = CREAD | CLOCAL;
		Config.c_cflag = Config.c_cflag & ~CRTSCTS;
		// Vitesse
		switch (Vitesse)
		{
			case BPS9600: 	Config.c_cflag |= B9600;break;
			case BPS4800: 	Config.c_cflag |= B4800;break;
			case BPS2400: 	Config.c_cflag |= B2400;break;
			case BPS19200: 	Config.c_cflag |= B19200;break;
			default: 		//fprintf(stderr,"Vitesse non utilisable\n");
							strcpy(MessageConfigurer, "Vitesse non utilisable !\n");
							exit (-1);
		}
 
		// Taille data
		switch (NbBits)
		{
			case BIT8: Config.c_cflag |= CS8;break;
			case BIT7: Config.c_cflag |= CS7;break;
			case BIT6: Config.c_cflag |= CS6;break;
			case BIT5: Config.c_cflag |= CS5;break;
			default: 	//fprintf(stderr,"Taille de donnee non conforme\n");
						strcpy(MessageConfigurer, "Taille de donnee non conforme !\n");
						exit (-1);
		}
 
		// Parite
		switch (Parite)
		{
			case PARITE_PAIRE : Config.c_cflag |=  PARENB; break;
			case PARITE_IMPAIRE : Config.c_cflag |= (PARODD | PARENB);break;
			default : break;
		}
 
		// Nombre de bits de stop
		switch(NbStop)
		{
			case STOP2 : Config.c_cflag |= CSTOPB;break;
		}
 
		// Application de la configuration
 
		Res = tcsetattr(fd, TCSANOW, &Config);
		if (Res == -1)
		{
			fprintf(stderr, "Erreur lors de l'application de la configuration\n");
			   exit (-1);
		}
		tcflush(fd, TCIFLUSH);
		tcflush(fd, TCOFLUSH);
	}
	return 0;
}
 
//----------------------------------------------------------------------------
void KRs232::AfficherMessageConfigurer()
{
	printf("%s\n\n", MessageConfigurer);
}
 
//----------------------------------------------------------------------------
int KRs232::Envoyer(char *pChaine)
{
   int Res = write (fd, pChaine, strlen(pChaine));
   return (Res);
}
 
//----------------------------------------------------------------------------
int KRs232::Recevoir(int Nb, char* pChaine)
{
	int i = 0;
	char Car;
	int Res;
 
	do
	{
		Res = read (fd, &Car, 1);
		if (Res > 0)
		{
			pChaine[i] = Car;
			i++;
		}
	} 
	while (i < Nb);
 
	pChaine[i] = '\0';
	return i;
}
 
//----------------------------------------------------------------------------
int KRs232::Recevoir(char Fin, char* pChaine, int Mode)
{
	int i = 0;
	char Car = 0x00;
	int Res;
 
	do
	{
		Res = read(fd, &Car, 1);
		if (Res > 0)
		{
			pChaine[i] = Car;
		   	i++;
		}
	} 
	while (Car != Fin);
 
	if (Mode == SANS_FINAL)
	   i--;
 
	pChaine[i] = '\0';
	//reception = pChaine;
	tcflush(fd, TCIFLUSH);
	return i;
}
 
//----------------------------------------------------------------------------
int KRs232::Recevoir(char Fin, char* pChaine, int Mode, int Attente)
{
	int i = 0;
	char Car = 0x00;
	int Res;
	//time_t TimeRef;
	//time_t Time;
	struct timeval TimeRef, Time;
	unsigned int Dif = 0;
 
	gettimeofday(&TimeRef, NULL);
 
	do
	{
		Res = read(fd, &Car, 1);
		if (Res > 0)
		{
			gettimeofday(&TimeRef, NULL);
			pChaine[i] = Car;
		   	i++;
		}
 
		gettimeofday(&Time, NULL);
		Dif = (Time.tv_sec - TimeRef.tv_sec) * 1000000 + (Time.tv_usec - TimeRef.tv_usec);
 
		if (Dif >= Attente * 1000)
		{
			pChaine[i] = '\0';
			return TIMEOUT;
		}
	} 
	while (Car != Fin);
 
	if (Mode == SANS_FINAL)
	   i--;
 
	pChaine[i] = '\0';
	tcflush(fd, TCIFLUSH);
	return i;
}
 
//----------------------------------------------------------------------------
int KRs232::RecevoirCaractere(char* Caractere, int Attente)
{
	int Res;
	char Car;
	struct timeval TimeRef, Time;
	//struct timezone tz;
	unsigned int Dif = 0;
	//time_t TimeRef;
	//time_t Time;
 
	gettimeofday(&TimeRef, NULL);
	do
	{
		gettimeofday(&Time, NULL);
		Res = read (fd, &Car, 1);
		Dif = (Time.tv_sec - TimeRef.tv_sec) * 1000000 + (Time.tv_usec - TimeRef.tv_usec);
	}
	while((Res == 0) && ( Dif < Attente * 1000));
 
	if (Res > 0)
	{
		*Caractere = Car;
		return OK;
	}
	return TIMEOUT;
}
 
//----------------------------------------------------------------------------
int KRs232::RecevoirFichier(char *NomFichier, int AttenteDebut)
{
	FILE *Fichier;
	char Car;
	char chCar[2];
	int AttenteFin = 2000;
	int Res;
 
	// attente du 1er caractaere du fichier
	do
	{
		Res = RecevoirCaractere(&Car, AttenteDebut);
	}
	while(Res != OK && Res != TIMEOUT);
	if (Res == OK)
	{
		// 1er caractaere reçu
		Fichier = fopen(NomFichier,"w");
		do
		{
			chCar[0] = Car;
			chCar[1] = '\0';
			fputs(chCar, Fichier);
			Res = RecevoirCaractere(&Car, AttenteFin);
		}
		while (Res != TIMEOUT);
		fclose(Fichier);
		return OK;
	}
	return TIMEOUT;
}
//------------------------------------------------------------------------
void KRs232::setText(char *a)
{
	textenvoyer = a;
	printf("je passe par la 1");
//	carrecu->setText("Envoie:");
//	carrecu->setText(a);
//	carrecu->setText("  ");
}
//------------------------------------------------------------------------
void KRs232::update()
{
	/*int F;
	char* message;
 
	F = Recevoir(0X0D,message,1);
   	switch(F)
   	{
		case 0:
			printf("ok");
			break;
		case -1:
			printf("erreur de merde");
			break;
		case -2:
			printf("TIMEOUT");
			break;
		case 1:
			printf("rien reçu");
			break;
		default:
			printf("la c'est la fin des haricot");
			break;
    	}
 
	/*carrecu->setText("Reçu:");
	carrecu->setText(message);	
	carrecu->setText("  ");*/
 
 
}	
 
KRs232::~KRs232()
{
//	close(fd);
}
la classe envoie .cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
#include "envoie.h"
 
Envoie::Envoie()
 : QLineEdit()
{
}
 
void Envoie::renvoiemessage()
{
	//emit returnTheText(text);
}
 
void Envoie::returnTheText(char)
{
}
Envoie::~Envoie()
{
}
et le .h de envoie
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
 
#ifndef ENVOIE_H
#define ENVOIE_H
 
#include <QLineEdit>
 
/**
        @author Olivier <olivier@MonAsus>
*/
class Envoie : public QLineEdit
{
public:
    Envoie();
 
    ~Envoie();
 
private slots:
	void renvoiemessage();
 
signals:
	void returnTheText(char);
};
 
#endif