|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
Sujet : com port et thread [ Système / Périphérique ] (fantasio36)
Informations & options pour cette discussion
mardi 30 septembre 2008 à 06:20:03 |
com port et thread

fantasio36
|
Re-Bonjour a tous, je suis mega bloque depuis une bonne semaine........A l'aide!! J'attends dans une routine une lecture de 1024 bytes sur le port COM que je dois lire par paquet de 64 bytes. Mon probleme est que je n'arrive pas a lire l'event de reception qui a lieu dans la routine dediee dans une autre partie du soft. Du coup je me retrouve bloque et il me faudrait sortir de cette routine de lecture pour que l'event de reception puisse etre leve, puis retour dans ma routine de lecture....bref, comment est-il possible par exemple de mettre un flag a 1 dans ma routine de reception, sachant que cette routine de reception doit pouvoir venir interrompre l'execution de ma routine d'attente de mise a 1 de ce flag? Ou bien est-il possible de faire autrement??? Si c'est pas clair, je peux donner plus de details!! Merci, Florent
|
|
|
mardi 30 septembre 2008 à 08:48:17 |
Re : com port et thread

maitredede
|
Salut, En effet c'est pas clair  Tu aurais un exemple de code sous la main ? @+ Dédé
|
|
|
mardi 30 septembre 2008 à 09:33:23 |
Re : com port et thread

leprov
|
Non cest carrément pas clair. Pour lire dans un port COM, en général on a deux solutions :
1 - s'abonner a l'event datareceived de l'objet serialport et lire dans la méthode handler de l'event
2 - créer un thread, puis lire en boucle dans ce thread. A priori dans ton cas, le mieux est d'utiliser cette solution. tu lis les données en boucle jusqu'a ce que ta trame soit complète, et une fois que cest le cas, tu la traite, puis tu te remet en attente de lecture (le mieux étant de fournir cette trame à un autre thread qui s'occupera de gérer tout ca, pour ne pas interrompre la lecture au cas ou quelque chose d'autre arriverait)
|
|
|
mardi 30 septembre 2008 à 09:39:04 |
Re : com port et thread

maitredede
|
Sinon, tu peux aussi utiliser la propriété BaseStream de ton SerialPort, et là tu peux mettre ce que tu veux comme Stream avec. De plus, tu peux l'utiliser en asynchrone, ce qui ne nécessitera pas de gérer un autre thread (comme gérer l'arret de ce thread à l'arret du programme).
|
|
|
mardi 30 septembre 2008 à 09:44:26 |
Re : com port et thread

fantasio36
|
OK, voici en resume/simplifie ce que j'ai:
routine pour la requete de 256 bytes:
private void Button_Readfromdevice(object sender, EventArgs e) { ..... COMport.Write(buffer, 0, 19); // requete pour 64 bytes while (flag_received != true); flag_received = false; Read_64Bytes_from_Buffer(); COMport.Write(buffer, 0, 19); // requete pour 64 bytes supplementaires while (flag_received != true); flag_received = false; Read_64Bytes_from_Buffer(); COMport.Write(buffer, 0, 19); // requete pour 64 bytes supplementaires while (flag_received != true); flag_received = false; Read_64Bytes_from_Buffer(); COMport.Write(buffer, 0, 19); // requete pour 64 bytes supplementaires while (flag_received != true); flag_received = false; Read_64Bytes_from_Buffer();
// 256 bytes recus }
routine de reception com port: public static void comport_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { flag_received = true; }
Je commence a croire qu'il me faut faire du multi threading, mais pour le moment rien ne fonctionne du tout!! En fait sur un microcontrolleur on a une interruption de generee lorsque je recois une trame sur le COM, mais je n'arrive pas a faire qqchose de similaire sur le visual C#. Je reste desesperement bloque sur le test du flag de reception....
Ton aide/suggestions sont grandement les bienvenus!! Et si c'est tjrs pas clair, n'hesite pas a me le faire savoir! Merci, Florent
|
|
|
mardi 30 septembre 2008 à 09:54:48 |
Re : com port et thread

maitredede
|
Essaie ce code : byte[] requette; //requete pour 64 bytes COMPort.Write(requette, 0, 19); List<byte> trame = new List<byte>(); byte[] buffer = new byte[64]; while (trame.Count < 1024) { //Réception de 64bits COMPort.BaseStream.Read(buffer, 0, buffer.Length); //stocke le buffer dans la trame trame.AddRange(buffer); } //Récupère le buffer complet buffer = trame.ToArray(); Pas besoin de gérer l'évènement "DataReveived" Si ça ne marche pas, je t'en mettrait un autre avec de l'asynchrone...
|
|
|
mardi 30 septembre 2008 à 10:35:22 |
Re : com port et thread

fantasio36
|
Merci pour ta reponse super rapide, je vais essayer cela de suite! Serais-t-il possible que tu me mette l'autre version aussi, asynchrone?? J'ai essaye gras de chose a ce sujet, avec des begininvoke et autres trucs tordus, ca n'a jamais marche!!!
Merci bcp pour ton aide, Florent
|
|
|
mardi 30 septembre 2008 à 11:10:05 |
Re : com port et thread

fantasio36
|
Re-salut, Je viens d'essayer mais les valeurs retournees dans le buffer sont tres bizarres, je me prends pas mal de 0x1f au debut de la trame et le reste des data semblent erronées...Lors de mes precedents essais, j'avais remarque que ca marchait tjrs si j'attendais l'event data_received. Par contre lors de mes essais precedents je faisais un while (COMPort.BytesToRead <= 64); mais ca me donnait aussi au final des data erronees...Est-il possible d'implementer la methode asynchrone dont tu m'as parle?
Merci encore pour l'aide! Florent
|
|
|
mardi 30 septembre 2008 à 11:16:45 |
Re : com port et thread

maitredede
|
Essaie avec celui-là :
byte[] requette; //requete pour 64 bytes COMPort.Write(requette, 0, 19);
List<byte> trame = new List<byte>(); byte[] buffer = new byte[64]; while (trame.Count < 1024) { //Réception de 64bits int read = COMPort.BaseStream.Read(buffer, 0, buffer.Length); //stocke le buffer dans la trame for (int i = 0; i < read; i++) { trame.Add(buffer[i]); } } //Récupère le buffer complet buffer = trame.ToArray();
Tes données erronées en début, je ne sais pas... C'est peut-être un résidu de ce qu'il y a dans le buffer de ton port. Avant d'envoyer ta requête, essaie d'ajouter : COMPort.DiscardInBuffer();
Je vois pour te faire la version asynchrone...
|
|
|
mardi 30 septembre 2008 à 11:28:07 |
Re : com port et thread

maitredede
|
Version asynchrone : private System.IO.Ports.SerialPort COMPort; private byte[] buffer; private List<byte> trame; private void StartRead(byte[] requette) { //requete pour 64 bytes COMPort.DiscardInBuffer(); COMPort.Write(requette, 0, 19); trame = new List<byte>(); buffer = new byte[64]; COMPort.BaseStream.BeginRead(buffer, 0, buffer.Length, this.COMPort_Read, null); } private void COMPort_Read(IAsyncResult result) { //Fin de lecture int read = COMPort.BaseStream.EndRead(result); for (int i = 0; i < read; i++) { trame.Add(buffer[i]); } if (trame.Count >= 1024) { //Trame complète lue } else { //Continue à recevoir COMPort.BaseStream.BeginRead(buffer, 0, buffer.Length, this.COMPort_Read, null); } } Tu appelles "StartRead" avec ta requête, et tu fais ton traitement de trame complète à l'endroit où c'est marqué "trame complète lue". Voilàààààà  @+ Dédé
|
|
|
Cette discussion est classé dans : lecture, port, reception, routine, com
Répondre à ce message
Sujets en rapport avec ce message
problem reception com port, lecture sequentielle par paquet de 256 bytes [ par fantasio36 ]
Bonjour a tous, Voila mon casse tete....J'ai un dongle USB qui me peux m'envoyer jusqu'a 256 bytes d'un coup. Lorsque j'ai besoin de moins de 256 byte
reception des mesures d'un telemetre sur un port COM [ par kiviste ]
Bonjour, je voudrais savoir si quelqu'un serais comment réceptionner des mesures d'un télémètre via le port série en bluetooth . Pour le moment j'ar
Accès port COM Virtuel [ par arb ]
BonjourJ'utilise des petits modules qui font la conversion port série -> USB pour dialoguer avec un petit micro. Je souhaite récupérer la liste des po
Port COM et Bluetooth GSM [ par 10demon10 ]
Bonjour à tousVoila j'ai une petite question qui me tourne dans la tête depuis un petite moment. En fait je sais qu'il est possible d'utilisé les port
aide port com [ par aurelleouf ]
bonjour à tous, Je développe actuellement un logiciel qui dialogue via le port série avec un produit à base de pic. C'est un projet qui a été dével
detection des periph usb connectes au PC [ par fantasio36 ]
Bonjour a tous,Voila j'ai ecrit un code qui me scan tous les com port du PC (afin de detecter un dongle USB qui enumere en com port). Afin de fairs un
Transmettre un tableau de string à un port COM [ par miguil ]
Bonjour,Je ne sais pas si je poste dans le bon thème mais j'espère que quelqu'un pourra m'aider.J'ai cherché partout comment traduire une commande C++
Event Port COM [ par Stroumi ]
Bonjour, je viens de créer une petite application qui me permet de recupérer des messages envoyé de différents appareils via la liaison série...(Winfo
Lecture d'un port USB [ par lucio ]
J'aimerais pouvoir lire les données en provenance d'un port USB (dans mon cas un periph IRDA branché sur le port USB). Cependant, je ne sais comment m
Thread qui bloque l'appli (lecture port COM) [ par el_teedee ]
Slt, voilà, je lance un thread qui lit ce qui arrive sur le port série. L'instruction suivante boucle sur elle même tant que l'on ne recoit rien : r
Livres en rapport
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|