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.