|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Lycéen Inscription : septembre 2012 Messages : 10 ![]() |
système: windows 7
IDE: code::block Bonjour, Je sollicite encore une fois de l'aide sur ce site car j'ai rencontré un problème pour programmer un événement sur un port série sous windows. Mon but est d'abord de créer un "time out" sur la fonction de lecture du port série ( ReadFile() ) pour qu'elle ne bloque pas indéfiniment le programme, ça j'ai pu le faire avec la fonction SetCommTimeout(). Ce "time out" une fois configuré, on peut invoquer la fonction ReadFile() qui se stoppe au bout du temps configuré précédemment, mais le problème c'est que si on reçoit des données à la moitié du "time out" il faut attendre la totalité du temps pour pouvoir traiter les données. Donc, dans un deuxième temps, j'ai voulu instauré un événement avec un "time out" qui, lui, stoppe quand des données sont présentes sur le port série (ou plutôt dans les buffers internes du port série...enfin là je suis pas sur) Ça aussi j'ai réussit à le réaliser, mais mon problème vient du fait que je n'arrive pas à récupérer les données après que l'événement se soit déclenché. En fait mon programme réagit très bien, j'ai raccordé deux pc, sur l'un j'ai créer un générateur de trame qui envoi une chaîne de caractère passé en argument et sur l'autre il y a mon programme avec un événement qui attend des données en réception. Quant je déclenche le générateur de trame, mon événement détecte les données, puis il invoque la fonction ReadFile() qui au passage génère une erreur ( ERROR_IO_PENDING -> Overlapped I/O operation is in progress), puis j'affiche mon buffer de réception et là rien :p . (ps: je vous rassure mes port COM sur chaque pc sont configurés exactement pareil) Je pense que l'erreur générée y est pour quelque chose, et encore je ne croie pas (là aussi je ne suis pas sur). Voici mon code : Code :
J'ai aussi pensé que je devais mal configurer ma structure _DCB qui à son tour paramètre le port série (c'est probable). J'ai testé tout un tas de chose dont voici les liens et rien ne marche ou du moins je suis pas doué. En tout cas j'ai trouvé aucun exemple propre qui fonctionne : http://cpp.developpez.com/faq/vc/?page [...] ithSerialPort (je me suis inspiré de celui-ci) http://msdn.microsoft.com/en-us/librar [...] serial_topic4 Merci d'avance pour toute réponse ou lien qui pourrait me mettre sur la voie. |
||
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() |
Overlapped, c'est pour les lectures/écritures asynchrones.
En gros, tu dois démarrer la lecture avec ReadFile(), puis attendre sur ton événement, puis tu peux utiliser ton buffer.
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
|
|
00
|
|
|
#3 | ||||||
|
Invité régulier
![]() Lycéen Inscription : septembre 2012 Messages : 10 ![]() |
Merci pour le conseille et effectivement j'arrive bien à lire les données maintenant mais j'ai un nouveau problème pour la récupération des données.
Je n'arrive pas à récupérer toute les données en déclarant un événement sur l'arrivé d'un caractère sur le port série et parfois elles sont manquantes. Par contre j'arrive à récupérer l'ensemble des donnée si je place un événement sur l'arrivé d'un caractères de contrôle que je paramètre auparavant; mais avec une contrainte qui est de savoir le nombre totale d'octets qui va arrivé et que ce caractère de contrôle ce trouve à la fin de la trame. D'autre part le nombre d'octet lue par ReadFile() est faussé, il est inférieur au nombre vraiment lue. Donc je suis contraint d'une part d'avoir des trame avec un caractère de contrôle à la fin et d'autre part de savoir la taille de celle-ci. Le problème ]est que mon dispositif avec le quel je communique génère des trames avec un caractère de contrôle qui ce trouve au début de la trame et qui sont de taille variable. voicie mon code: Code :
Code :
Code :
Merci d'avance pour votre aide, là vraiment je bloque.
|
||||||
|
|
00
|
|
|
#4 | ||
|
Invité régulier
![]() Lycéen Inscription : septembre 2012 Messages : 10 ![]() |
J'ai trouvé ce matin une méthode pour récupérer une trame entière sans le caractère de contrôle, en utilisant un événement sur un "break" sur le port série:
Code :
Voilà mais je bloque toujours pur recevoir des données de taille variable donc si vous avez des idées à me proposé je suis preneur. Merci d'avance pour votre aide. Amicalement et librement |
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com