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)

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

Membre Club
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

Membre Club
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

Membre Club


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

Membre Club
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

Membre Club
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é


1 2

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


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.