Lire port série C# et convertir en texte

Lire port série C# et convertir en texte - C#/.NET managed - Programmation

Marsh Posté le 24-04-2012 à 15:40:05    

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 :
  1. using System;
  2. using System.Linq;
  3. using System.Data;
  4. using System.Text;
  5. using System.Drawing;
  6. using System.IO.Ports;
  7. using System.Windows.Forms;
  8. using System.ComponentModel;
  9. using System.Collections.Generic;
  10. using System.Threading;
  11. using System.IO;
  12. namespace WindowsFormsApplication1
  13. {
  14.     public partial class Form1 : Form
  15.     {
  16.         private SerialPort sp = new SerialPort();
  17.         public enum LogMsgType { Incoming, Outgoing, Normal, Warning, Error };
  18.         private Color[] LogMsgTypeColor = { Color.Blue, Color.Green, Color.Black, Color.Orange, Color.Red };
  19.         public Form1()
  20.         {
  21.             InitializeComponent();
  22.             sp.BaudRate = 9600;
  23.             sp.Parity = Parity.None;
  24.             sp.StopBits = StopBits.One;
  25.             sp.DataBits = 8;
  26.             sp.Handshake = Handshake.None;
  27.             sp.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
  28.         }
  29.         private void button1_Click(object sender, EventArgs e)
  30.         {
  31.             bool erreur = false;
  32.             // Si le port est ouvert, il faut le fermer
  33.             if (sp.IsOpen) sp.Close();
  34.             else
  35.             {
  36.                 // Réglage paramètre du port
  37.                 sp.PortName = cmbPortName.Text;
  38.                 try
  39.                 {
  40.                     // Ouvrir le port
  41.                     sp.Open();
  42.                 }
  43.                 catch (UnauthorizedAccessException) { erreur = true; }
  44.                 catch (IOException) { erreur = true; }
  45.                 catch (ArgumentException) { erreur = true; }
  46.                 if (erreur)
  47.                     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);
  48.                 else
  49.                     MessageBox.Show("Connexion réussi","Port disponible" );
  50.             }
  51.         }
  52.         // Connexion à la fenêtre du terminal
  53.         private void Log(LogMsgType msgtype, string msg)
  54.         {
  55.             rtfTerminal.Invoke(new EventHandler(delegate
  56.             {
  57.                 rtfTerminal.SelectedText = string.Empty;
  58.                 rtfTerminal.SelectionFont = new Font(rtfTerminal.SelectionFont, FontStyle.Bold);
  59.                 rtfTerminal.SelectionColor = LogMsgTypeColor[(int)msgtype];
  60.                 rtfTerminal.AppendText(msg);
  61.                 rtfTerminal.ScrollToCaret();
  62.             }));
  63.         }
  64.         //Convertit un tableau d'octets en une chaîne formatée de chiffres hexadécimaux.
  65.         private string ByteArrayToHexString(byte[] data)
  66.         {
  67.             StringBuilder sb = new StringBuilder(data.Length * 3);
  68.             foreach (byte b in data)
  69.                 sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
  70.             return sb.ToString().ToUpper();
  71.         }
  72.         private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
  73.         {
  74.             // Si le port est ouvert, le fermer
  75.             if (!sp.IsOpen) return;
  76.             // Obtenir le nombre d'octets en attente dans le tampon du port
  77.             int bytes = sp.BytesToRead;
  78.             // Créez une zone tampon (tableau d'octets) pour stocker les données entrantes
  79.             byte[] buffer = new byte[bytes];
  80.             // Lire les données du port et de le stocker dans la mémoire tampon
  81.             sp.Read(buffer, 0, bytes);
  82.             // Montrer à l'utilisateur les données entrantes dans un format hexadécimal
  83.             Log(LogMsgType.Incoming, ByteArrayToHexString(buffer));
  84.         }
  85.     }
  86. }


 
Voilà ce que j'obtiens en héxa : 18 66 60 00 18 98 18 66 1E 06 7E 7E E6 80  
 
Je vous remercie d'avance.

Reply

Marsh Posté le 24-04-2012 à 15:40:05   

Reply

Marsh Posté le 20-05-2012 à 21:06:43    

Il y a quoi dans le byte[] ??
Tu dois certainement pouvoir initialiser un Timespan avec, encore faut il savoir comment sont encodées les données reçues et si il y a une transformation arithmétique à y appliquer...


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed