begin process at 2012 02 11 01:53:15
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Système

 > 

Périphérique

 > 

com port et thread


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,009 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales