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 :

Problème exploitation de données venant du port série


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème exploitation de données venant du port série
    Bonjour tout le monde !

    Je suis actuellement en stage de DUT Mesures Physiques, et mon sujet comporte une grosse partie programmation en C#, que je ne connaissais pas avant. Mes compétences sont donc relativement limitées. J'ai déjà passé des heures et des heures sur Internet à regarder des tutos, des exemples sur le site de Microsoft, etc. Mais aujourd'hui je bloque, et j'ai besoin de votre aide...

    Je vous explique ! À mon ordinateur sera branchée une carte Arduino Méga2560 chargée de compter un phénomène physique (ça, ça fonctionne). La carte va envoyer sur le port USB un nombre (admettons toutes les secondes). Ce que j'aimerais, c'est mettre tous ces nombres dans un tableau pour pouvoir ensuite les exploiter. Mais là, je bloque. J'ai essayé de bidouiller comme j'ai pu (Tableaux, listes, etc.), je me suis beaucoup inspirée de différents tutos que je trouvais, mais je ne suis jamais arrivée au résultat que je veux.

    J'ai réussi une fois à enregistrer un tableau dans un fichier .txt, mais il ne me mettait toujours que la dernière donnée reçue, et pas toute la liste.

    Voici le bout de code que j'ai tenté aujourd'hui :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) // Initialisation du gestionnaire de réception des données
            {
                SerialPort PortUSB = (SerialPort)sender; // Identification du port
                string Données = PortUSB.ReadExisting(); // Lecture des données entrantes
                List<string> ListeReception = new List<string>(); // Création d'une liste
                while (PortUSB.IsOpen) // Tant que le port USB est ouvert
                {
                    ListeReception.Add(Données); // On ajoute les données reçues à la liste
                }
                string Tableau = Convert.ToString(ListeReception); // Conversion de liste en caractères
                System.IO.File.WriteAllText(@"C:\Users\(...)\Données.txt", Tableau); // Ecriture de la liste dans un fichier .txt
             }
    Si vous avez besoin du code entier, je pourrais le mettre.

    Je vous remercie d'avance !
    Lilly.

  2. #2
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 640
    Points : 2 149
    Points
    2 149
    Par défaut
    Bonjour,

    cette ligne ne fait pas qu'écrire le nom de l'objet de la liste ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                string Tableau = Convert.ToString(ListeReception); // Conversion de liste en caractères
    J'aurai fait plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string separateur = " ";
    string Tableau = String.Join(separateur,ListeReception.ToArray());

  3. #3
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Citation Envoyé par Lilly. Voir le message
    J'ai réussi une fois à enregistrer un tableau dans un fichier .txt, mais il ne me mettait toujours que la dernière donnée reçue, et pas toute la liste.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                string Données = PortUSB.ReadExisting(); // Lecture des données entrantes
                List<string> ListeReception = new List<string>(); // Création d'une liste
                while (PortUSB.IsOpen) // Tant que le port USB est ouvert
                {
                    ListeReception.Add(Données); // On ajoute les données reçues à la liste
                }
    J'ai juste une remarque a faire "Données" est un string... donc pour moi c'est normal que la liste ne contienne qu'une seule valeur...

  4. #4
    Membre habitué
    Homme Profil pro
    Code Addict
    Inscrit en
    Janvier 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Code Addict

    Informations forums :
    Inscription : Janvier 2013
    Messages : 61
    Points : 175
    Points
    175
    Par défaut
    Sinon tu peux faire comme ça :

    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
     
            private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) // Initialisation du gestionnaire de réception des données
            {
                SerialPort PortUSB = (SerialPort)sender; // Identification du port
                string Données = PortUSB.ReadExisting(); // Lecture des données entrantes
                List<string> ListeReception = new List<string>(); // Création d'une liste
                while (PortUSB.IsOpen) // Tant que le port USB est ouvert
                {
                    ListeReception.Add(Données); // On ajoute les données reçues à la liste
                }
                using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\(...)\Données.txt", false))
                {
                    foreach (string datum in ListeReception)
                    {
                        file.WriteLine(datum);
                    }
                }
             }

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses !

    Je crois que j'ai un second problème. Est-ce que selon vous, cette boucle fonctionne ?
    Avant cette partie du programme, j'ai mis en place un bouton de "Connexion/Déconnexion" qui fonctionnait jusqu'ici. Désormais, que je remplace ma fin de programme par string.join (que je ne connaissais pas, merci de l'info !) ou par la boucle using, dès que je déconnecte le port, il me trouve une erreur. J'ai lancé plusieurs fois le programme, et il ne m'indique pas toujours la même ligne. Parfois il surligne la ligne que j'ai dans la boucle while, d'autre fois la ligne d'écriture dans le fichier...

    Merci d'avance !

    PS : J'aime beaucoup ta signature, PixelJuice !

  6. #6
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut
    Bonjour,

    Tu parles de quel boucle?

    Ton programme a cette trame suivante :

    Sur l'action du bouton connexion :
    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
     
    if (isConnect == false)
    {
    SerialPort mySerialPort = new SerialPort("COM1");
    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();
    isConnect = true;
    //Création du fichier
    String Filename = String.Format(@"{0}\{1}_{2}.csv", Path, _Name, DateTime.Now.ToString("yyyyMMdd_HHmm"));
    _MyHistory = new FileStream(Filename, FileMode.OpenOrCreate, FileAccess.ReadWrite);
     
    ListeReception = new List<string>(); // Création d'une liste global
     
    }
    Sur l'action du bouton déconnexion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if (isConnect)
    {
    mySerialPort.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler);
    mySerialPort.Close();
    mySerialPort = null;
    //vide le buffer et ferme le le fichier
     _MyHistory .Flush();
     _MyHistory .Close();
     
    isConnect = false;
    }
    Sur l'action de réception de donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) // Initialisation du gestionnaire de réception des données
            {
                SerialPort PortUSB = (SerialPort)sender; // Identification du port
                string value= PortUSB.ReadExisting(); // Lecture des données entrantes
                ListeReception.Add(value); // On ajoute les données reçues à la liste
                byte[] info = new UTF8Encoding(true).GetBytes(value + "\r\n"); //Mise en forme en UTF8 sans BOM
                _MyHistory.Write(info, 0, info.Length);//Ecriture de la données
             }
    Évite de mettre des noms de variables avec des accents.
    Est ce que j'ai bien compris ton problème?
    Au lieu d'utiliser un streamwriter, j'ai préféré utiliser un FileStream plus simple à gérer au sujet des principes d'encodage de texte.
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

Discussions similaires

  1. Réponses: 7
    Dernier message: 18/07/2011, 17h34
  2. ecriture de données sur le port série
    Par sanatou dans le forum Windows
    Réponses: 2
    Dernier message: 20/12/2006, 18h09
  3. Envoyer des données sur le port série
    Par jbidou88 dans le forum Flash
    Réponses: 3
    Dernier message: 18/09/2006, 11h33
  4. [javax.comm] Envoyer des données sur le Port série
    Par deuspi dans le forum Applets
    Réponses: 2
    Dernier message: 29/08/2006, 09h40
  5. récupération de d'octet venant du port série
    Par jekeclo dans le forum Access
    Réponses: 2
    Dernier message: 29/11/2005, 17h14

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