Bonjour à Tous !
Je suis sous WINDOWS et j communique avec un module GPS en port série (virtualisé par un port USB) pour télécharger des coordonnées GPS.
à la réception d'une grande qté de donnée à 115200Bauds, je remarque qu'il ya des charactères qui manquent Exemple, je dois recevoir 10000 lignes identiques avec un id incrémental, remarquez qu'il coupe la ligne 452 et passe à 469 d'où une ligne illisible et 17lignes manquantes :
Il n'y a pas de règle, les erreurs arrivent de façon aléatoire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 450;2;44.456789;1.345678;0.345;2010;04;10;11;03 451;2;44.456789;1.345678;0.345;2010;04;10;11;03 452;2;44.456789;1.356789;1.345678;0.345;2010;04;10;11;03 469;2;44.456789;1.345678;0.345;2010;04;10;11;03 470;2;44.456789;1.345678;0.345;2010;04;10;11;03
Remarque: je gère la réception octet par octet (à l'ancienne) :
> Est-ce la vitesse trop évelvée ? (115200Bps)
> Est-ce mon code qui déconne ?
> Est-ce le driver
> Est-ce cette API ? (il y a une alternative: RXTX)
>> Voilà mnt 7 jours de perdus dans mon PFE sur ce problème. Mon encadrant commence à s'agacer.. à l'aiiide !
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 // Evènement(de l'API) déclenché à la récepetion de donnée case SerialPortEvent.DATA_AVAILABLE: byte[] readBufferLine = new byte[100]; try { int numLigne = 0; int Byte = 0; long totalBytes = 0; int lineSize = 0; String ligne = "riendans;laligne"; byte[] tempByte = new byte[1]; do { Byte = inputStream.read(); // je lis 1 octet //je dédecte les caractères: imprimables ou \n ou -1 if((Byte != -1)&& (((Byte>=0x20) && (Byte<=0x7E))||(Byte == '\n'))) { totalBytes++; // je l'ajoute à ma ligne readBufferLine[lineSize] = (byte)numBytes; lineSize++; if((numBytes=='\n')||(numBytes=='>')) { readBufferLine[lineSize]='\0'; ligne = new String(readBufferLine,0,lineSize); numLigne++; system.out.println(ligne); lineSize = 0; } }//si '>' c'est une fin d'une ligne également }while ((Byte !=-1)&&(totalBytes<5000000)&&(numBytes!='>')) ;
Merci^^
Partager