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.
Le problème est que le thread doit avoir le prototype suivant :
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 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 static UINT Lire_Donnee(LPVOID pvParam);
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.
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; }
Quelqu'un connaitrait une astuce pour que je puisse afficher un caractere des que je le recois.
Merci
Bibi
Partager