en lisant vite fait la doc du bouzin, je me dis qu'il va falloir se méfier avec les flush car ils peuvent intervenir en plein milieu d'un paquet de données et comme tu n'as aucun moyen de repérer le début d'un paquet de 5 octets, si tu te contentes de prendre les octets 5 par 5 en supposant qu'ils correspondent à chaque fois à un unique paquet entier, tu risques de te retrouver avec des valeurs abérantes.
en gros je vois 3 solutions pour t'en sortir:
- soit tu arrives à suivre la cadence imposée par le télémètre et à lire et traiter toutes les données qu'il t'envoie (pas dit que ça soit possible avec du Python sur RasPi)
- soit:
- tu commences le scan
- tu lis autant de données que nécessaire (probablement des mesures sur 360°)
- tu stoppes le scan
- tu vides le buffer
- tu commences un nouveau scan
- etc...
- soit tu débrouilles sans flush et tu gardes le compte des octets reçus pour savoir ou commencent les paquets de données. c'est le plus compliqué, mais aussi le plus réaliste je pense.
pour expliquer la 3e solution:
admettons que tu commences ton scan, tu reçois donc 7 octets de "Response Descriptor" puis une suite de paquets de 5 octets.
tu commences donc par lire les 7 premiers octets, tu initialise une variable reste (par exemple) à 0, puis à chaque fois que tu fais une lecture:
- tu lis tout ce que contient le buffer et tu lui enlève ses (5-reste) premiers octets
- tu fais un modulo 5 sur la taille des données récupérées pour savoir le nombre d'octets que tu a en trop (tu as 4 chances sur 5 que le dernier paquet soit tronqué) et tu gardes le resultat dans la variable reste
- tu vires les reste derniers octets des données récupérées, tu gardes les N*5 derniers octets du résultat (N étant le nombre de mesures que tu veux lire).
- tu te retrouves donc avec N paquets entiers
par exemple:
- 1e lecture: reste=0, taille des données lues=1548483 octets
tu enlèves 5 octets au début (5-0, tu as donc maintenant 1548478 octets)
tu calcules le modulo : 3 (1548478 % 5) que tu stocke dans la variable reste
tu enlèves 3 octets à la fin
tu te retrouve avec 1548475 octets de données bien calées dont tu peux récupérer mettons 100 mesures (soit les 500 deniers octets)
tu ignores le reste
- 2e lecture: reste=3, taille des données lues=12451 octets
tu enlèves 2 octets au début (5-3, ce sont les 2 octets restant du paquet tronqué à la lecture précédente, tu as donc maintenant 12449 octets)
tu calcules le modulo : 4 (12449 % 5) que tu stocke dans la variable reste
tu enlèves 4 octets à la fin
tu te retrouve avec 12445 octets de données bien calées dont tu peux récupérer encore 100 mesures
tu ignores le reste
- etc...
Partager