IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#] Temps d'attente port série


Sujet :

C#

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 52
    Par défaut [C#] Temps d'attente port série
    Bonjour tous le monde,

    Voila je suis un débutant en C# et j'aimerais d'aide ^^ Voila je voudrai savoir comment faire pour faire attendre un port Série. Je m'explique je voudrais envoyer une trame quelconque vers un périphérique et recevoir une réponse sauf que je ne sais jamais quand je vais recevoir cette réponse. Je voudrais donc savoir s'il est possible de faire patienter mon port série afin qu'il attente simplement de recevoir une donnée ? Merci beaucoup pour votre futur

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Tu peux regarder du côté de la classe ManualResetEvent ou d'AutoResetEvent.

    Comme expliqué dans l'e-book gratuit de Joseph Albahari (Threading in C#), ManualResetEvent est une variante d'AutoResetEvent.

    La différence, c'est que ManualResetEvent n'est pas automatiquement réinitialisée quand un thread appelle WaitOne. De manière imagée, c'est un peu comme un pont : quand tu appelles la méthode Set le pont s'ouvre, ce qui a pour effet de laisser passer tous les threads ayant appelé WaitOne. Quand tu appelles la méthode Reset, le pont se ferme, ce qui peut créer une fille d'attente jusqu'à la prochaine ouverture...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 52
    Par défaut
    Oula je ne comprend pas vraiment tout lol je débute dans le C# et je ne sais pas trop comment utilisé ce que tu m'a envoyé :s

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Il faut que tu te documentes sur les Threads en lisant ceci
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 52
    Par défaut
    Bon j'arrive à faire ce que je veut mais maintenant j'ai un autre problème c'est que lorsque je fait ma lecture de ce qui arrive il ne lis que ma premiere et pas le reste ... je met le code que j'ai réaliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
           public Form1()
            {
                InitializeComponent();
                debut:
     
     
                mySerialPort.BaudRate = 9600;
                mySerialPort.Parity = Parity.None;
                mySerialPort.StopBits = StopBits.One;
                mySerialPort.DataBits = 8;
                mySerialPort.Handshake = Handshake.None;
     
                mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
     
                mySerialPort.Open();
                outBuffer[0] = 0xAA;
                outBuffer[1] = 0x3D;
                outBuffer[2] = 0x00;
                int j = 3;
                for (int i = 0; i < text1.Length; i++)
                {
                    outBuffer[j] = text1[i];
                    j++;
                }
                mySerialPort.Write(outBuffer, 0, outBuffer.Length);
                outBuffer = new byte[61];
     
                main();   
     
                mySerialPort.Close();
                goto debut;
            }
     
            public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
            {
                SerialPort sp = (SerialPort)sender;
                //System.Threading.Thread.Sleep(500);
                //string indata = sp.ReadExisting();
                //taillebuffer = sp.BytesToRead;         
     
            }
            public void main()
            {
                //taillebuffer = mySerialPort.BytesToRead;
     
                mySerialPort.Read(inBuffer, 0, inBuffer.Length);
     
                detection = inBuffer[19].ToString("X");
                if (detection == "0")
                {
                    return;
                }
                if (detection == "1")
                {
                    outBuffer[0] = 0xAA;
                    outBuffer[1] = 0x3D;
                    outBuffer[2] = 0x00;
                    int a = 3;
                    for (int i = 0; i < text2.Length; i++)
                    {
                        outBuffer[a] = text2[i];
                        a++;
                    }
                    mySerialPort.Write(outBuffer, 0, outBuffer.Length);
     
                }
            }
        }

  6. #6
    Membre très actif
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 102
    Par défaut
    Bonjour,

    Je reviens sur ta première question. Il me semble que pour attendre sur le port série le mieux c'est peut-être le paramètre Timeout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    serialPort1.ReadTimeout = SerialPort.InfiniteTimeout;
    Ensuite il te faut faire le point sur comment tu souhaite structurer ton soft.
    Moi perso sur mon dev actuel j'ai un un "backgroundWorker" qui se charge de la communication série. et je laisse l'interface tranquille pendant que je ne recois rien.N'ai pas peur en lisant les termes. C'est un mécanisme qui n'est pas parfait mais qui dépanne bien. Tu troiuvera plein de docs et d'exemples sur les "BackgroundWorker" sur le net. Et sinon tu repostes.

    Cordialement

  7. #7
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Effectivement en restant mono-threadé il suffit de s'abonner à l'évènement DataReceived comme tu l'as fait Pas besoin de t'embêter avec le multi-threading comme j'ai pu le proposer.

    Pour le reste, il y a un exemple tout simple de lecture dispo ici : SerialPort (RS-232 Serial COM Port) in C# .NET (rubrique "Read Data From Port").

    Tu remarqueras que le port est déclaré en tant qu'attribut de la classe, contrairement à ce que tu as fait dans ton code où il est en variable locale.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 52
    Par défaut
    je n'arrive a comprendre et a voir ou tu veux que je mette la ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    serialPort1.ReadTimeout = SerialPort.InfiniteTimeout;

  9. #9
    Membre très actif
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 102
    Par défaut
    Bonsoir,

    Dans l'init de ton port à la suite de la conf vitesse par exemple. Juste après ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mySerialPort.BaudRate = 9600;
    tu rajoutes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mySerialPort.ReadTimeout = SerialPort.InfiniteTimeout;
    Mais attention réfléchis à ce que tu souhaites faire avant. Mois j'ai 2 threads et mon second thread est en attente de réception. Donc la lecture sur port série est bloquante. Si toi tu passes avec un eventHandler "DataReceived" et je pense que cette ligne n'est pas utile. Soit tu utilises le backgroundWorker et là c'est nécessaire.

    Les deux solutions peuvent fonctionner je pense, c'est un choix. Au début j'utilisais l'event handler dans le thread de mon formulaire. Et quand mon périphérique s'est mis à m'envoyer plein de traces d'un coups l'IHM se figeait. Alors j'ai peut être pas trouvé la meilleure solution mais elle fonctionne.

    Maintenant le periph débite à fond (115200), mon thread de réception récupère tout et le stocke dans une FIFO. En même temps mon IHM reste fluide et fonctionnelle. Ce n’était pas le cas avec ma première version du soft.

    Réfléchis bien, fais un choix et suis le ....

    Cordialement

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 52
    Par défaut
    C'est bon j'ai réussi à faire ce que je veux merci pour votre aide c'est super sympa

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD17] délais d'attente sur port série
    Par karim15 dans le forum WinDev
    Réponses: 1
    Dernier message: 14/03/2014, 10h51
  2. [plot] Tracé en temps directe depuis un port série
    Par tkwleboss dans le forum MATLAB
    Réponses: 3
    Dernier message: 13/09/2011, 21h01
  3. traitement temp réel de données port série
    Par lezebulon dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 29/07/2010, 12h13
  4. [Série] Accès au port série sous linux
    Par ghost dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 10/10/2007, 10h43
  5. Problème avec le port série sous Windows XP
    Par didou2dek dans le forum Composants VCL
    Réponses: 6
    Dernier message: 02/09/2003, 19h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo