Salut
Voila mon probleme: j'ai développé une appli en C++ avec Microsoft Development Environment 2003 Version 7.1.3088 (Visual .Net 2003 koi) qui gère une communication avec une balance industrielle via le port série. Cette appli fonctionne correctement sous win 2000 et je reçois parfaitement la trame envoyée par la balance.
Or, lorsque j'essaie la meme appli sous win 98, je ne récupère aucune information de la-dite balance. Apparemment, mon application ne retourne aucune erreur donc l'ouverture de la communication avec le port série est correcte et la réception pareil. J'ai vérifié les paramètres de configuration du port série grâce à l'hyperterminal, et lui, il récupere bien la trame envoyée.
Je vous joins le codes de la fonction d'ouverture de communication :
Voici le code de ma fonction de réception :
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 e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits) { g_ErrCom = e_ErrCom_None; // On ouvre le port série g_hCom = CreateFile(strPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING,NULL); if(g_hCom == INVALID_HANDLE_VALUE) { // Echec g_ErrCom=e_ErrCom_Creation; } else { // On vide les buffers PurgeComm(g_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); // On paramètre le port série g_DCB.DCBlength = sizeof(DCB); //Configuration actuelle GetCommState(g_hCom, &g_DCB); //Modification du DCB g_DCB.BaudRate=BaudRate; g_DCB.ByteSize=BitsSize; g_DCB.Parity=Parity; g_DCB.StopBits=StopBits; g_DCB.fDtrControl=DTR_CONTROL_DISABLE; //Configuration de la liaison serie SetCommState(g_hCom,&g_DCB); } return g_ErrCom; }
Et enfin la fonction qui gère la fermeture :
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 e_ErrCom ReceptionCom(void *lpBuf,unsigned int nCountMax, unsigned int* pCountRead) { COMSTAT Stat; DWORD Errors; unsigned int nCarALire; unsigned long NCarLus=0; if(g_hCom!=NULL) { //on pari sur pas d'erreur g_ErrCom=e_ErrCom_None; //Pour éviter de gérer un time out; Laisse le temps de recevoir la trame. Sleep(1000); //Pour connaitre le nombre d'octets dans le buffer d'entrée ClearCommError(g_hCom,&Errors,&Stat); nCarALire=Stat.cbInQue; //On effectue la lecture si il y a des caractères présents if( (nCarALire>0)&&(nCarALire<=nCountMax) ) { if(ReadFile(g_hCom,lpBuf,nCarALire,&NCarLus,NULL)==0) { g_ErrCom=e_ErrCom_Reception; } } *pCountRead=NCarLus; } else //Le port n a pas été ouvert g_ErrCom=e_ErrCom_Creation; //Compte rendu de l'exécution return g_ErrCom; }
Voila, ces fonctions sont-elles compatibles avec w98 ? comment pourrai-je les transformer pour que mon programme tourne sur cet OS ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void FermeCom() { if(g_hCom!=NULL) { CloseHandle(g_hCom); } }
J'ai cru comprendre que sous w98, on peut directement travailler avec les registres du port série, p-e est-ce cela la solution ?
Merci d'avance
Partager