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 :

Lire port série C# et convertir en texte [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 18
    Points
    18
    Par défaut Lire port série C# et convertir en texte
    Bonjour à tous,

    Je viens vous solliciter parce que je rencontre un petit soucis. Je suis en train de développer une petite application qui me permet de lire les données d'un chronomètre. J'ai réussi à faire la lecture des données, mais comme c'est la première fois que je fais ça, j'aurais voulu savoir comment traduire en format texte ce qui ressort du chrono, c'est-à-dire comment obtenir le temps indiquer sur le chronomètre. Pour l'instant, je récupère mes données en héxa. Mais je bloque sur la conversion en chaîne.

    Je vous mets le code que j'utilise pour la lecture du port série.

    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
    99
    100
    101
    102
    103
    104
     
    using System;
    using System.Linq;
    using System.Data;
    using System.Text;
    using System.Drawing;
    using System.IO.Ports;
    using System.Windows.Forms;
    using System.ComponentModel;
    using System.Collections.Generic;
     
    using System.Threading;
    using System.IO;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            private SerialPort sp = new SerialPort();
            public enum LogMsgType { Incoming, Outgoing, Normal, Warning, Error };
            private Color[] LogMsgTypeColor = { Color.Blue, Color.Green, Color.Black, Color.Orange, Color.Red };
     
            public Form1()
            {
                InitializeComponent();
     
                sp.BaudRate = 9600;
                sp.Parity = Parity.None;
                sp.StopBits = StopBits.One;
                sp.DataBits = 8;
                sp.Handshake = Handshake.None;
                sp.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                bool erreur = false;
     
                // Si le port est ouvert, il faut le fermer
                if (sp.IsOpen) sp.Close();
                else
                {
                    // Réglage paramètre du port
                    sp.PortName = cmbPortName.Text;
     
                    try
                    {
                        // Ouvrir le port
                        sp.Open();
                    }
                    catch (UnauthorizedAccessException) { erreur = true; }
                    catch (IOException) { erreur = true; }
                    catch (ArgumentException) { erreur = true; }
     
                    if (erreur)
                        MessageBox.Show("Impossible d'ouvrir le port COM. Très probablement, il est déjà en cours d'utilisation, a été supprimé, ou n'est pas disponible.", "COM Port indisponible", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    else
                        MessageBox.Show("Connexion réussi","Port disponible");
                }
            }
     
            // Connexion à la fenêtre du terminal
            private void Log(LogMsgType msgtype, string msg)
            {
                rtfTerminal.Invoke(new EventHandler(delegate
                {
                    rtfTerminal.SelectedText = string.Empty;
                    rtfTerminal.SelectionFont = new Font(rtfTerminal.SelectionFont, FontStyle.Bold);
                    rtfTerminal.SelectionColor = LogMsgTypeColor[(int)msgtype];
                    rtfTerminal.AppendText(msg);
                    rtfTerminal.ScrollToCaret();
                }));
            }
     
            //Convertit un tableau d'octets en une chaîne formatée de chiffres hexadécimaux.
            private string ByteArrayToHexString(byte[] data)
            {
                StringBuilder sb = new StringBuilder(data.Length * 3);
                foreach (byte b in data)
                    sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
                return sb.ToString().ToUpper();
            }
     
     
            private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                // Si le port est ouvert, le fermer
                if (!sp.IsOpen) return;
     
                // Obtenir le nombre d'octets en attente dans le tampon du port
                int bytes = sp.BytesToRead;
     
                // Créez une zone tampon (tableau d'octets) pour stocker les données entrantes
                byte[] buffer = new byte[bytes];
     
                // Lire les données du port et de le stocker dans la mémoire tampon
                sp.Read(buffer, 0, bytes);
     
                // Montrer à l'utilisateur les données entrantes dans un format hexadécimal
                Log(LogMsgType.Incoming, ByteArrayToHexString(buffer));
     
            }
        }
    }
    Je vous remercie d'avance.

  2. #2
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Points : 713
    Points
    713
    Par défaut
    Bonjour,

    Pour convertir un hexa en string, il te fait déjà passer par le format Int puis String:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int chrono = int.Parse(valeurHexa, System.Globalization.NumberStyles.HexNumber );
    string affichChrono = Convert.ToString(chrono);

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 18
    Points
    18
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      //Convertit un tableau d'octets en une chaîne formatée de chiffres hexadécimaux.
            private string ByteArrayToHexString(byte[] data)
            {
                StringBuilder sb = new StringBuilder(data.Length * 3);
                foreach (byte b in data)
                    sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
                return sb.ToString().ToUpper();
            }
    Ce code me renvoie une chaîne de chiffre hexa, mais comment faire ensuite pour traduire cette chaîne ?

    Et si je modifie mon code en mettant sp.ReadExisting()
    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 void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                // Si le port est ouvert, le fermer
                if (!sp.IsOpen) return;
     
                // Obtenir le nombre d'octets en attente dans le tampon du port
                string bytes = sp.ReadExisting();
     
                // Créez une zone tampon (tableau d'octets) pour stocker les données entrantes
                //byte[] buffer = new byte[bytes];
     
                // Lire les données du port et de le stocker dans la mémoire tampon
                //sp.Read(buffer, 0, bytes);
     
                // Montrer à l'utilisateur les données entrantes dans un format hexadécimal
                Log(LogMsgType.Incoming, bytes);
            }
    J'obtiens ce genre de caractère : ??~~??`f?~~??

  4. #4
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Points : 713
    Points
    713
    Par défaut
    Et que reçois tu en Hexa?
    Un exemple de chaîne nous aidera.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 18
    Points
    18
    Par défaut
    En Héxa, je reçois ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    18 66 60 00 18 98 18 66 1E 06 7E 7E E6 80
    Cela correspond à une pression sur le bouton du chrono.

  6. #6
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Points : 713
    Points
    713
    Par défaut
    Ta doc te précise en quoi la sortie se trouve ? MiliSec?
    Et quel format est attendu??
    Et quel valeur sur ton chrono correspond à cette chaine??

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 18
    Points
    18
    Par défaut
    Voilà comment ça doit sortir :
    00:16'10"18

  8. #8
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Points : 713
    Points
    713
    Par défaut
    Cela ne semble pas possible avec les hexa.
    Ou alors plusieurs temps sont données.
    As tu essayé de travaillé directement avec les bytes?
    On pourrait ainsi comparer si la valeur est correcte ou non.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 18
    Points
    18
    Par défaut
    Pour travailler directement avec les bytes, tu procèdes comme ceci :

    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 void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                // Si le port est ouvert, le fermer
                if (!sp.IsOpen) return;
     
                // Obtenir le nombre d'octets en attente dans le tampon du port
                int bytes = sp.ReadByte();
     
                // Créez une zone tampon (tableau d'octets) pour stocker les données entrantes
                //byte[] buffer = new byte[bytes];
     
                // Lire les données du port et de le stocker dans la mémoire tampon
                //sp.Read(buffer, 0, bytes);
     
                // Montrer à l'utilisateur les données entrantes dans un format hexadécimal
                Log(LogMsgType.Incoming, bytes.ToString());
            }
    ou ceci :
    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 void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                // Si le port est ouvert, le fermer
                if (!sp.IsOpen) return;
     
                // Obtenir le nombre d'octets en attente dans le tampon du port
                int bytes = sp.ReadByte();
     
                // Créez une zone tampon (tableau d'octets) pour stocker les données entrantes
                byte[] buffer = new byte[bytes];
     
                // Lire les données du port et de le stocker dans la mémoire tampon
                sp.Read(buffer, 0, bytes);
     
                // Montrer à l'utilisateur les données entrantes dans un format hexadécimal
                Log(LogMsgType.Incoming, ByteArrayToHexString(buffer));
            }

  10. #10
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Points : 713
    Points
    713
    Par défaut
    Citation Envoyé par Narizuke Voir le message
    Pour travailler directement avec les bytes, tu procèdes comme ceci :
    Euh on s'est mal compris, je te demandais une chaîne de tes bytes que tu recois (avant la conversion en hexa)

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 18
    Points
    18
    Par défaut
    Ah ok, excuse moi, je fais ça et je te dis ce que je reçois

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 18
    Points
    18
    Par défaut
    ça serait plus probable si ça ressemblait à un truc dans le genre :
    122332

  13. #13
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Points : 713
    Points
    713
    Par défaut
    Citation Envoyé par Narizuke Voir le message
    ça serait plus probable si ça ressemblait à un truc dans le genre :
    122332
    Je ne pense pas que cela soit les bytes que tu reçois

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 18
    Points
    18
    Par défaut
    Erreur de ma part désolé, mauvais copié/coller
    Je referais ça tout à l'heure.

    En tout cas, merci de ton aide.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 18
    Points
    18
    Par défaut
    Malgré toutes les manipulations que j'ai pu faire, impossible d'obtenir un truc qui ressemble à des bytes

  16. #16
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Points : 713
    Points
    713
    Par défaut
    Essai ca :
    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 void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                // Si le port est ouvert, le fermer
                if (!sp.IsOpen) return;
     
                // Obtenir le nombre d'octets en attente dans le tampon du port
                int bytes = sp.ReadByte();
     
                // Créez une zone tampon (tableau d'octets) pour stocker les données entrantes
                byte[] buffer = new byte[bytes];
     
                // Lire les données du port et de le stocker dans la mémoire tampon
                sp.Read(buffer, 0, bytes);
     
                string myByte = Encoding.UTF8.GetString(buffer);
     
                Log(LogMsgType.Incoming,myByte);
            }

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 18
    Points
    18
    Par défaut
    J'obtiens ça ; x`�fx�~
    Je crois que je suis maudit ^^

  18. #18
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Points : 713
    Points
    713
    Par défaut
    Citation Envoyé par Narizuke Voir le message
    J'obtiens ça ; x`�fx�~
    Je crois que je suis maudit ^^
    ASCII?? (à la place d'UTF8), je ne pense pas que cela change grand chose.

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 18
    Points
    18
    Par défaut
    J'ai essayé mais pareil. Serait-il possible que les données soit codées ?

  20. #20
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2011
    Messages : 610
    Points : 713
    Points
    713
    Par défaut
    Non sinon cela serait indiqué dans la doc. A moins que ce soit déjà marqué.
    Mais je pense qu'il faut revoir la transformation en hexa.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [pyserial] lire et écrire sur le port série
    Par elscorpio dans le forum Bibliothèques tierces
    Réponses: 3
    Dernier message: 29/05/2008, 13h39
  2. Comment lire une pin sur le port série du pc
    Par KENPACHI dans le forum LabVIEW
    Réponses: 1
    Dernier message: 25/05/2007, 12h56
  3. [Qbasic] Infos port série -> fichier texte
    Par zoid54 dans le forum Basic
    Réponses: 2
    Dernier message: 28/04/2007, 21h53
  4. Lire sur un port série de manière synchrone ?
    Par Hokagge dans le forum MFC
    Réponses: 26
    Dernier message: 09/06/2005, 12h16
  5. Quel langage choisir pour lire sur le port série ?
    Par Nico76 dans le forum Windows
    Réponses: 7
    Dernier message: 28/04/2004, 10h42

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