narizuke
Messages postés38Date d'inscriptionmardi 31 mai 2011StatutMembreDernière intervention 9 février 2014
-
24 avril 2012 à 10:08
narizuke
Messages postés38Date d'inscriptionmardi 31 mai 2011StatutMembreDerniè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));
}
}
}
narizuke
Messages postés38Date d'inscriptionmardi 31 mai 2011StatutMembreDerniè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);
}
StagiaireMsl
Messages postés43Date d'inscriptionmardi 19 avril 2011StatutMembreDernière intervention22 avril 20133 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.
narizuke
Messages postés38Date d'inscriptionmardi 31 mai 2011StatutMembreDerniè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.
Vous n’avez pas trouvé la réponse que vous recherchez ?