Bonjour
Je suis en stage dans une entreprise qui installe des systèmes de comptage (via camera ou capteurs de mouvement)
Je dois développer un logiciel permettant de communiquer par le port série avec l'appareil qui effectue et stocke les comptages.
Ca va faire 3 semaines que j'ai débuté le stage. J'ai pas mal avancé et également pas compris le fonctionnement mais je bute sur un problème.
Actuellement je communique avec l'appareil via un Handle sur le port com qui va bien. Je fais des WriteFile, ReadFile en mode synchrone donc sans overlapped, mais une fonction de l'appareil permet de lui dire "compte et transmet moi un message à chaque entrée OU sortie". Quand j'effectue cette commande avec mon programme en mode synchrone, je dois faire un ReadFile (envoie d'un caractère sans importance pour forcer les ReadFile à chaque E/S)
Ce qui n'est pas fort pratique. Donc j'aurais voulu utiliser le mode asynchrone.
Or quand je fais un ReadFile() dans ce mode, RadFile me retourne VRAI, alors qu'il devrait retourner FAUX étant asynchrone. Windows n'est pas très clair sur le fait que parfois il peut se produire ce phénomène (fichier compressé par ntfs...)
Si quelqu'un a eu un soucis tel que celui là et qu'il a trouvé une solution, ca serait sympas de me fournir quelques pistes. Pour vous permettre de visualiser mon code, je vous fourni ce morceau...
Merci d'avance.
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 char* bufferTemp = new char[TAILLE_BUFFER]; for(int i = 0; i < TAILLE_BUFFER; i++) bufferTemp[i] = '\0'; unsigned long nbOctetsLus = 0; OVERLAPPED ov = {0}; ov.Offset = 0; ov.OffsetHigh = 0; ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); COMSTAT comStat; DWORD erreur; ClearCommError(hCom, &erreur, &comStat); DWORD nbOctetsALire = (comStat.cbInQue < TAILLE_BUFFER) ? comStat.cbInQue : TAILLE_BUFFER; if(nbOctetsALire == 0) return 0; BOOL success = ReadFile(hCom, bufferTemp, nbOctetsALire, &nbOctetsLus, &ov); cout << "nb d'octects lus : " << nbOctetsLus <<endl; if(!success) { //readfile a renvoyé false, on recupere l'error cout << "ReadFile operation is pending" << endl; if(GetLastError() == ERROR_IO_PENDING) { bool pending = true; while(pending) { //l'erreur est celle qu'on attend (mode asynchrone) BOOL bResult = GetOverlappedResult(hCom, &ov, &nbOctetsLus, TRUE); if(!bResult) { if(GetLastError() == ERROR_IO_PENDING) cout << "still pending :(" << endl; } else { cout << "read file completed" << endl; pending = false; } } } else cout << "pas d'erreur de pending..." << endl; } if(DEBUG && success) cout << "Nb d'octets lus : " << nbOctetsLus << endl; //ici nbOctetsLus à un sens bufferTemp[nbOctetsLus] = '\0'; buffer.assign(bufferTemp); return nbOctetsLus;
Partager