Accueil > Forum > > > > com port et thread
com port et thread
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ée 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
correction de données sur COM [ par debaser99 ]
Bonjour, Voila, je suis nouveau sur le forum, j'ai fait le tour des sujets, j'espere ne pas avoir raté qqchose, mais sinon pardonnez moi. Le probleme
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++
Détecter le type de matériel du port COM [ par Grigou252525 ]
Bonjour à tous, J'utilise actuellement des périphériques USB qui se connectent via un émulateur de port série (Port COM). Le numéro du port COM est c
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
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
Livres en rapport
|
Derniers Blogs
[SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|