Bonjour

Je fais un prog similaire à un hyperterminal, J'ai donc fais un prog multithread, permetant l'envoi des caracteres ainsi que la reception de maniere concurente.

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
 void ChyperterminalDlg::OnConnexion()
{
	HWND *phObjectHandle = new HWND ;
	if(RS232Obj.m_port_is_open==false)
	{
		// Ouverture du port Serie
		RS232Obj.m_hPort=RS232Obj.open_serial_port(0, 9600, 8, 0, 1);
		if(!RS232Obj.m_hPort)
			exit(-1);
		RS232Obj.m_port_is_open=true;
 
		*phObjectHandle = GetSafeHwnd();
		// Cree un nouveau thread
		if(!AfxBeginThread(&Lire_Donnee, phObjectHandle))
		{ // Could not create thread
			EndDialog(IDCANCEL);
		}
 
 }
Le problème est que le thread doit avoir le prototype suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
static UINT Lire_Donnee(LPVOID pvParam);
Le fait que celui ci soit static rend impossible la mise à jour de la variable de l'Edit Box (car non statique) ainsi que l'utilisation de la fonction UpdateData (meme problème).

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
UINT ChyperterminalDlg::Lire_Donnee(LPVOID pvParam)
{
	DWORD Nb_Octet_a_lire;
	DWORD Nb_Octet_lus;
	DWORD StatusModem;
	BOOL result;
 
	Nb_Octet_a_lire=1;
 
	//Configuration du masque du gestionnaire d'evenement
	SetCommMask(RS232Obj.m_hPort, EV_RXCHAR);
 
	while(RS232Obj.m_port_is_open==true)
	{
		// Attente d'un evenement
		// Ici Attendre que le Buffer d'entree ait un caractere
		WaitCommEvent(RS232Obj.m_hPort,&StatusModem,0); 
 
		//Reconfiguration du gestionnaire d'evenement
		SetCommMask(RS232Obj.m_hPort, EV_RXCHAR); 
 
		// Lecture du Buffer
		result=ReadFile(RS232Obj.m_hPort /* HANDLE du peripherique a lire*/,
						&(RS232Obj.Donnee_lue) /* Buffer d'enregistrement 
											   des donnees lues*/,
						Nb_Octet_a_lire /* Nbre d'octets à lire au Max*/ ,
						&Nb_Octet_lus /* Nbre d'octets Lus réellement */,
						&(RS232Obj.m_Ov) /* Overlapped */);
 
		if(!result)	return -1; //Echec lors de la lecture
 
		// Recuperation des donnees
		if(!GetOverlappedResult( RS232Obj.m_hPort, &(RS232Obj.m_Ov), &Nb_Octet_lus, TRUE))
			return -1;
 
 
 
 
	}
 
	//Fermeture demandée par l'utilisateur
	AfxEndThread(0, // Fermeture normale du thread
				 TRUE  //Efface le thread de la mémoire
				 );
	return 0;
}
Le caractere est correct (le debuggage me le confirme) mais je ne sais pas comment l'afficher dans mon EditBox. La variable associée à mon EditBox est du type CString.

Quelqu'un connaitrait une astuce pour que je puisse afficher un caractere des que je le recois.

Merci

Bibi