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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 chevronné
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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
    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 averti
    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
    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 chevronné
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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
    Par défaut
    Et que reçois tu en Hexa?
    Un exemple de chaîne nous aidera.

  5. #5
    Membre averti
    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
    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 chevronné
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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
    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??

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

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