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# et communication avec une carte électronique autonome


Sujet :

C#

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Août 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut c# et communication avec une carte électronique autonome
    bonjour à tous!

    Je vais commencer par décrire mon projet

    dans le cadre de mon examen de passage je dois réaliser un petit système qui, grâce à une carte électronique, doit:

    sur la carte électronique:
    - envoyer à un programme en c# (via le port COM) la température et la luminosité sous cette forme: XX.XX,Y -> XX.XX étant la température et Y un indice de luminosité (allumé-éteint)

    le programme ressemble à ceci:



    je me suis d'abord focalisé sur température et luminosité.

    Pour le test, depuis ma carte, j'envoie "bonjour";

    Cette donnée est bien reçue, j'en suis certain, par l'ordinateur via un programme que j'utilise en électronique: Microship AN1310.



    cependant sur mon programme, il est bien affiché "bonjour" dans la température réelle mais à certain moment lors du renvoi de la nouvelle donnée (encore "bonjour" en somme) des fois ça affiche "r","ur","our", etc.
    Par apprès ça peut afficher "bonjour" et recommencer à bugguer.

    j'espère que vous voyez mon problème :/ j'ignore totalement d'ou celà peut provenir malgré de nombreuses recherches...

    voici mon code c# :

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
     
    namespace ProjetAoutJacoby
    {
        public partial class Form1 : Form
        {
            public delegate void receiveData(string str);
            public Form1()
            {
                InitializeComponent();
            }      
     
            private void comboBoxCOM_SelectedIndexChanged(object sender, EventArgs e)
            {
                serialPort1.PortName = "" + comboBoxCOM.SelectedItem;
            }
     
    		//tout simplement ouvrir/fermer le port COM grâce au bouton
            private void boutonPlayCom_Click(object sender, EventArgs e)
            {
                try
                {
     
                    if (boutonPlayCom.Text.Equals("Play"))
                    {
                        serialPort1.Open();
                        serialPort1.BaudRate = 9600;
                        boutonPlayCom.Text = "Stop";
                    }
                    else
                    {
                        serialPort1.Close();
                        boutonPlayCom.Text = "Play";
     
                    }
     
     
                }
                catch (UnauthorizedAccessException ex)
                {
                    MessageBox.Show("Port déjà utilisé dans un autre programme\n\n" + ex);
     
                }
                catch (System.IO.IOException ex)
                {
                    MessageBox.Show("Port non ouvert\n\n" + ex);
                }
            }
     
     
            /*
     * even port serie à la réception
     */
            private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
     
                    try
                    {
                        //tant qu'il y a des données entrée on continue
                        while (serialPort1.BytesToRead > 0)
                        {
                        string stringRead = serialPort1.ReadExisting();
                        Invoke(new receiveData(convertReceiveData), stringRead); //Car il reçoit les données sur un autre thread
                        }             
                    }
                    catch (System.IO.IOException ex)
                    {
                        MessageBox.Show("" + ex);
                    }
                    catch (System.InvalidOperationException ex)
                    {
                        MessageBox.Show("" + ex);
                    }
     
            }
     
     
     
            /*
             * Lié à la Méthode serialPort1_DataReceived
             */
            private void convertReceiveData(string strRead)
            {            
    			//affiche "bonjour" dans le label
                   tReelGetLabel.Text = strRead;
            }
     
        }
    }



    Je vous remercie car mon année est en jeu! :/

    Si vous voulez de plus ample informations -> je suis présent

    Jonathan

  2. #2
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Le port série peut recevoir et faire remonter les données au fil de l'eau "quand il veut".
    C'est à toi de gérer le format de ces données pour réifier la notion de messages.

    Donc il te faut bufferiser tant que tu ne récupères pas un message entier, dans ton cas une ligne.

    Je vais supposer que le séparateur de ligne est '\n'.

    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
    private StringBuilder buffer = new StringBuilder();
     
    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    { 
        try
        {
            //tant qu'il y a des données entrée on continue
            while (serialPort1.BytesToRead > 0)
            {
                string stringRead = serialPort1.ReadExisting();
     
                if (stringRead.Contains("\n")) // On a trouvé une fin de message
                {
                    string[] tokens = stringRead.Split('\n');
                    string endOfCurrendMessage = tokens[0];
                    string startOfNextMessage = tokens[1];
     
                    string message = buffer.ToString() + endOfCurrentMessage; // On reconstitue le message courant
                    Invoke(new receiveData(convertReceiveData), message); //Car il reçoit les données sur un autre thread
     
                    // On commence à stocker le prochain message
                    buffer.Clear();
                    buffer.Append(startOfNextMessage);
                }
                else
                {
                    buffer.Append(stringRead); // On n'a pas encore de message complet
                }
            }
        }
        catch (System.IO.IOException ex)
        {
            MessageBox.Show("" + ex);
        }
        catch (System.InvalidOperationException ex)
        {
            MessageBox.Show("" + ex);
        }
    }
    Ni testé ni compilé mais c'est l'idée...

    Note que pour être parfait il faudrait aussi être thread-safe car je ne pense pas qu'il y ait une quelconque garantie à ce niveau :
    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
    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    { 
        lock (serialPort1)
        {
            try
            {
                //tant qu'il y a des données entrée on continue
                while (serialPort1.BytesToRead > 0)
                {
                    ...
                }
            }
            catch (System.IO.IOException ex)
            {
                ...
            }
            catch (System.InvalidOperationException ex)
            {
                ...
            }
        }
    }
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Août 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Resolu
    un grand merci Pragmateek, c'était ça en effet.

    Maintenant ça marche nickel !!

    Problème résolu.

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

Discussions similaires

  1. Communication avec une carte RFID
    Par samybelarbi dans le forum Général Java
    Réponses: 1
    Dernier message: 28/05/2014, 11h46
  2. [WD15] communication RS232 avec une carte relais 8 canaux
    Par soufasoufa33 dans le forum WinDev
    Réponses: 9
    Dernier message: 25/10/2012, 03h41
  3. Communication avec une carte PCI
    Par faridaetudiante dans le forum Assembleur
    Réponses: 4
    Dernier message: 02/06/2010, 21h59
  4. Communication avec une application externe
    Par Lethal dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 27/02/2007, 18h30
  5. Problème avec une carte Sound Blaster Live
    Par zogstrip dans le forum Matériel
    Réponses: 4
    Dernier message: 25/09/2004, 20h43

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