Bonjour,
Pour définir le contexte, j'utilise la classe CCom de Farscape pour récupérer des données en mode asynchrone sur la liaison série. Je lance le thread de réception à partir d'une classe dérivée de CDialog. Lorsque le thread détecte l'événement EV_RXCHAR, il envoie un message WM_CCOMRCV vers ma classe parent dérivée de CDialog. L'arrivée de ce message déclenche la fonction suivante:
Ainsi, je viens lire et stocker les données dans le buffer de réception à chaque émission du message WM_CCOMRCV.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 long CComTLS::ON_WM_CCOMRCV(WPARAM wparam,LPARAM lparam) { char sz[4096+1] = {0}; m_comDll.ReadBuffer(sz,sizeof(sz)-1); m_sRx += sz; m_nTotalOctetLus += m_comDll.GetCountRead(); return 0L; }
Je gère un time out de réception grace au code suivant: (Ce code fait partie d'une fonction appellée par un autre thread de travail qui attend de réceptionner toutes les données émises).
Mon 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 if(ret) { bool bEndWhile = false; UINT OctetLus = 0; while(!bEndWhile) { OctetLus = m_nTotalOctetLus; Sleep(2000); if( OctetLus == m_nTotalOctetLus ) { bEndWhile = true; } } m_sMNV = m_sRx; }
Ce code fonctionne depuis un moment. Mais bizarrement, je perds des données depuis peu...
J'utilise ce même code dans une version antérieure du logiciel que je développe et j'obtenais ceci:
Maintenant j'obtiens cela:01 54 00 00 01 00 01 01 01 D8 0810 00000028 00 EF 4C TOTO
01 42 00 00 01 00 01 03 01 00 0800 000000B6 61 EF 4C TATA
01 54 00 01 01 00 01 01 01 C9 0810 00000028 00 EF 4C TOTO
01 42 00 01 01 00 01 03 01 00 0800 000000B6 61 EF 4C TATA
Il me manque donc de temps en temps des caractères (ici le saut de fin de ligne, mais aussi des données)...01 54 00 00 01 00 01 01 01 D8 0810 00000028 00 EF 4C TOTO0 01 00 01 03 01 00 0800 000000B6 61 EF 4C TATA 01 54 00 01 01 00 01 01 01 C9 0810 00000028 00 EF 4C TOTO01 42 00 01 01 00 01 03 01 00 0800 000000B6 61 EF 4C TATA
Quelles pourraient être les causes de pertes de données? et quelles pourraient être les raisons pour que d'un côté (version antérieur du logiciel) ca fonctionne et de l'autre (version actuelle) non?
Il y aurait il une histoire d'augmenter la priorité d'un thread?
Si vous avez des idées, merci d'avance.
Nicolas
Partager