Bonjour tout le monde,

Et oui, je viens encore vous sollicitez puisque je rencontre un problème, j'aurais besoin de vos lumières pour m'éclairer car là, j'ai du mal à comprendre.

En fait, j'aimerais découper une chaîne de caractère. Par compliquer vous allez me dire, puisqu'un simple substring() ferait l'affaire. Oui mais quand je fais ça sur ma chaîne, ma chaîne est déjà découpée en deux et pourtant je ne fais nul part un substring().

Je vous mets le code complet
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
 
using System;
using System.Text;
using System.Drawing;
using System.IO.Ports;
using System.Windows.Forms;
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 string trame = string.Empty;
 
        public Form1()
        {
            InitializeComponent();
 
            sp.BaudRate = 4800;
            sp.Parity = Parity.None;
            sp.StopBits = StopBits.One;
            sp.DataBits = 8;
            sp.ReceivedBytesThreshold = 1;
            sp.RtsEnable = true;
            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();
            foreach (byte b in data)
            sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
 
            return sb.ToString().ToUpper();
        }
 
         public 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));
            MessageBox.Show((ByteArrayToHexString(buffer).Length).ToString());
        }
    }
}
Mon soucis se trouve exactement sur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
ByteArrayToHexString(buffer).Substring(0, 2)
Si je fais
Code : Sélectionner tout - Visualiser dans une fenêtre à part
MessageBox.Show((ByteArrayToHexString(buffer).Length).ToString());
, je trouve une chaîne de 3 et une chaîne de 24.

Je ne comprends réellement pas pourquoi elle est déjà prédécoupée, et surtout comment je pourrais faire pour remédier à ça.

Je vous remercie d'avance