Com Port Série : 600 millisec pour lire 1 byte !
Bonjour et bonne année,
J'ai retourné mon problème dans tous les sens, j'ai vraiment besoin de vos avis éclairés ...
Je réalise un programme C (WinXP SP2, BCC 5.02) pour lire des données émises par un appareil bluetooth (qui communique avec le port 40 de mon pc).
Le programme crée un handle sur le port 40 (fonctions createfile, ...), paramètre les propriétés de l'appareil (baud rate = 9600, no parity, 1 stop bit), la taille du buffer, les timeouts.
! Je n'ai rien paramétré de spécial pour 'No Flow Control' par contre.
La connexion est OK, les données sont lues (la doc technique indique : 3 paquets de 125 Bytes de données par sec).
Le programme lit les données Byte par Byte, en mode synchrone (readfile).
La plupart des durées de lecture sont < 1ms. MAIS
tous les 250 bytes environ, la lecture d'un byte va prendre 600 ms (ou encore 15 ms).
J'ai fixé les timeouts comme ceci :
Code:
1 2 3 4 5
|
ReadIntervalTimeout=10;
ReadTotalTimeoutMultiplier=10;
ReadTotalTimeoutConstant=5000;
Mais ça n'a aucun effet (les 2 premiers en tout cas), est - ce le fait que c'est une connexion bluetooth ? |
Merci par avance. je suis preneur de toutes les idées !
Les miennes sont :
1) Readfile n'a rien à lire pendant 600 ms et attend. Mais pourquoi les timeout n'ont aucun effet ?
2) Les données arrivent normalement en continu mais la fonction Readfile 'buggue pendant 600 ms' pour la lecture d'un byte classique
3) Readfile met 600 ms pour lire un gros truc. Est ce possible que des stop bits soient manquants (erreur de l'appareil) pendant 600 ms ?
Pour info, j'utilise la Instrument Control Toolbox de matlab et j'ai exactement le même comportement.
Patrick
oui en effet. Merci Mais les timeouts?
Citation:
Envoyé par
crocodilex
Je n'ai pas tout saisi, mais tu dis toi même que ton appareil bluetooth émet 3 paquets de 125 caractères toutes les secondes.
Si on dit qu'un caractère est émis toute les millisecondes (9600 bauds), alors les 3 paquets sont émis en 375ms.
Ce qui veut dire qu'il y a un trou de 625ms toutes les secondes.
En effet Crocodilex, en fait l'appareil envoie 2 paquets puis stand by de 625 ms puis 2 paquets puis 625 ms. ce qui fait bien 625 + 250 = 875 et il me reste bien 125 ms pour compléter ma seconde et récupérer mon dernier paquet. Le fait que 3 paquets n'arrivaient pas en même temps me troublaient.
Mais par contre, pourquoi les timeouts n'ont aucun effet dans ce cas ? Quand je mets ReadTotalTimeoutConstant=600, le programme ne sort pas !
Merci encore, j'avais trop le nez dans mon projet.
Patrick