Forum Clubic

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.


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));

        }
    }
}

Dois-je procéder différemment peut-être ?

Je vous remercie d’avance.

Ca dépend de ce que te renvoie ton chronomètre. A quoi corresopnd le nombre hexadécimal que tu as, le nombre total de millisecondes ?
Edité le 26/04/2012 à 10:55

J’ai pu récupéré ce que je souhaitais. Je n’ai eu que très tardivement le protocole de communication du chronomètre. Du coup j’ai pu me dépatouillé avec ça et comparer mon résultat à ceux qui étaient présents sur le protocole
J’ai plus qu’à décomposer ma chaîne d’hexa et ça devrait être bon.

En tout cas merci quand même ^^