Lire port série C# et convertir en texte

narizuke Messages postés 38 Date d'inscription mardi 31 mai 2011 Statut Membre Dernière intervention 9 février 2014 - 24 avril 2012 à 10:08
narizuke Messages postés 38 Date d'inscription mardi 31 mai 2011 Statut Membre Dernière intervention 9 février 2014 - 25 avril 2012 à 09:14
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.

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

10 réponses

narizuke Messages postés 38 Date d'inscription mardi 31 mai 2011 Statut Membre Dernière intervention 9 février 2014
24 avril 2012 à 10:41
si je modifie mon code en mettant sp.ReadExisting()

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?~~??
0
narizuke Messages postés 38 Date d'inscription mardi 31 mai 2011 Statut Membre Dernière intervention 9 février 2014
24 avril 2012 à 10:49
Et voilà ce que j'obtiens en héxa :
18 66 60 00 18 98 18 66 1E 06 7E 7E E6 80
0
StagiaireMsl Messages postés 43 Date d'inscription mardi 19 avril 2011 Statut Membre Dernière intervention 22 avril 2013 3
24 avril 2012 à 12:18
Salut a toi
Personnellement je fais comme ça pour avoir la lecture en format texte :


         private void rsLectureDatamatrixCircuit_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) //Evenement sur lecture CAB 
        {
            string sTrameLecteurDatamatrixCircuits = "";

            Thread.Sleep(500);

            //On récupère le nombre d'octet présent dans le tampon
            int iNbOctet = this.rsLectureDatamatrixCircuit.BytesToRead;

            //Tableau acceuillant les données au format byte
            byte[] bTrame;
            bTrame = new byte[iNbOctet];

            //On lit le port
            this.rsLectureDatamatrixCircuit.Read(bTrame, 0, iNbOctet);

            //On récupère les données au format ASCII
            sTrameLecteurDatamatrixCircuits = System.Text.Encoding.ASCII.GetString(bTrame);

            //Arrêt du lecteur
            if (this.rsLectureDatamatrixCircuit.IsOpen)
            {
                this.rsLectureDatamatrixCircuit.Close();
                Thread.Sleep(250);
            }

            //Affichage lecture
            textBox1.Text = sTrameLecteurDatamatrixCircuits;
        }


Celui qui n expérimente rien ne se trompe qu'une seule fois.
0
narizuke Messages postés 38 Date d'inscription mardi 31 mai 2011 Statut Membre Dernière intervention 9 février 2014
24 avril 2012 à 13:36
En reprenant ce que tu fais, voilà ce que j'obtiens : 187866061886xf?188060FEFE80?`???
pas très cohérent comme résultat sachant que je veux obtenir un temps au format 00:00'00"00 ainsi que la place, la ligne, le dossard ainsi que le nombre de fois que l'on a appuyé sur le chrono.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
narizuke Messages postés 38 Date d'inscription mardi 31 mai 2011 Statut Membre Dernière intervention 9 février 2014
24 avril 2012 à 13:38
Rectification, j'obtiens un truc qui ressemble à ceci : ?`?~f~~??
0
StagiaireMsl Messages postés 43 Date d'inscription mardi 19 avril 2011 Statut Membre Dernière intervention 22 avril 2013 3
24 avril 2012 à 13:44
Est-tu sur que ton port série est bien configuré???


Celui qui n expérimente rien ne se trompe qu'une seule fois.
0
narizuke Messages postés 38 Date d'inscription mardi 31 mai 2011 Statut Membre Dernière intervention 9 février 2014
24 avril 2012 à 13:55
Voici les propriété de mon port :
Bits par seconde : 9600;
Bits de données : 8;
Parité : aucune;
Bit d'arrêt : 1;
Contrôle de flux : aucun;

Et voici mon code :
sp.BaudRate = 9600;
sp.Parity = Parity.None;
sp.StopBits = StopBits.One;
sp.DataBits = 8;
sp.Handshake = Handshake.None;


Je pense pas m'être planté.
0
StagiaireMsl Messages postés 43 Date d'inscription mardi 19 avril 2011 Statut Membre Dernière intervention 22 avril 2013 3
24 avril 2012 à 14:09
Erf, et bien je ne sais pas, j'utilise plusieurs connexions séries et mon code fonctionne très bien :s

Après, peu être que le chronomètre envoie un code "spécial" qu'il te faut décrypter ^^ mais je ne peux pas t'aider plus :s

Bonne chance!

Celui qui n expérimente rien ne se trompe qu'une seule fois.
0
narizuke Messages postés 38 Date d'inscription mardi 31 mai 2011 Statut Membre Dernière intervention 9 février 2014
24 avril 2012 à 14:19
Merci encore pour ton aide ^^
J'espère que le chrono n'envoie pas un code spécial :'(
0
narizuke Messages postés 38 Date d'inscription mardi 31 mai 2011 Statut Membre Dernière intervention 9 février 2014
25 avril 2012 à 09:14
Voici le protocole de sortie de mes données :

http://imagesia.com/scan_2bu
0
Rejoignez-nous