IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Découper une chaîne de caractères


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Par défaut Découper une chaîne de caractères
    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

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    Comment ca tu " je trouve une chaîne de 3 et une chaîne de 24." ?
    Si il n'y a qu'un seul messageBox tu ne peux avoir qu'une seule valeur.
    Si il y 2 messages box c'est parceque tu te trouves dans un évenement et qu'il est appelé 2 fois ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Narizuke Voir le message
    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 ne suis pas sûr d'avoir tout compris mais ce qu'il faut savoir c'est que Substring n'agit pas l'instance de la chaîne à laquelle on l'applique mais renvoie une valeur de retour qui contiendra la sous-chaîne attendue.

    Sinon expliques-nous plus clairement ton problème.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Par défaut
    Pour répondre à micka132,

    Mon évènement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    où il y a mon MessageBox n'est appelé qu'une fois si tu regardes bien mon code et c'est bien ça le soucis.

    Pour répondre à h2s84,

    En gros, j'aimerais découper ma chaîne en sous chaîne de taille différentes en fonction de ce que je reçois du port série.

    Par exemple, je reçois 600050005351800051 (c'est de l'héxa), j'aimerais la découper, pour que ça ressemble à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    string s1 = 6;
    string s2 = 0005;
    string s3 = 00053518;
    string s4 =  0005 ;
    string s5 = 1;
    Est-ce plus compréhensible comme ceci, ou faut-il que je fournisse plus d'explication ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Si le découpage respecte une logique prédéfinie alors rien ne t'empêche d'utiliser Substring()

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    string s = "600050005351800051";
    string s1 = s.Substring(0, 1); // // Toujours 1 caractère
    string s2 = s.Substring(s1.Length, 4); // Toujours 4 caractères
    string s3 = s.Substring(s1.Length + s2.Length, 8); // Toujours 8 caractères
    string s4 = s.Substring(s1.Length + s2.Length, s3.Length, 4); // Toujours 4 caractères
    string s5 = s.Substring(s1.Length + s2.Length, s3.Length , s4.Length , 1); // Toujours 1 caractère

    la logique que j'ai utilisée ci-dessus est simple et on part sur le fait que chaque portion de notre chaîne de caractère initiale aura toujours une taille fixe.
    Si cette logique est différente de la tienne alors il faudra nous l'énoncer.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Par défaut
    Ma chaîne ne sera pas toujours de la même taille puisque les informations sortantes du port série sont différentes. Pour définir sa taille, j'ai juste à récupéré le premier chiffre et je sais à quel type de message j'ai à faire, donc ça c'est pas un soucis.

    Mais voici ce que j'obtiens quand je fais les substring() :
    L'index et la longueur doivent faire référence à un emplacement situé dans la chaîne.
    Je remets le code où j'utilise ce que tu m'as donné :

    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
     
    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
                string s = ByteArrayToHexString(buffer);
                string s1 = s.Substring(0, 1); // // Toujours 1 caractère
                string s2 = s.Substring(s1.Length, 4); // Toujours 4 caractères
                string s3 = s.Substring(s1.Length + s2.Length, 8); // Toujours 8 caractères
                string s4 = s.Substring(s1.Length + s2.Length + s3.Length, 4); // Toujours 4 caractères
                string s5 = s.Substring(s1.Length + s2.Length + s3.Length + s4.Length, 1); // Toujours 1 caractère
                Log(LogMsgType.Incoming, ByteArrayToHexString(buffer));
                MessageBox.Show(s1 + s2 + s3 + s4 + s5);
     
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBox.Show(s1 + s2 + s3 + s4 + s5);
    me sert juste pour voir si la concaténation de ma chaîne découpée est similaire à ma chaîne du départ

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Narizuke Voir le message
    Ma chaîne ne sera pas toujours de la même taille puisque les informations sortantes du port série sont différentes. Pour définir sa taille, j'ai juste à récupéré le premier chiffre et je sais à quel type de message j'ai à faire, donc ça c'est pas un soucis.
    Donc je ne vois pas où tu coinces réellement alors que t'as la logique qui te permet de récupérer la taille en fonction du premier caractère ?

Discussions similaires

  1. Découper une chaîne de caractères
    Par gege2061 dans le forum Langage
    Réponses: 9
    Dernier message: 07/03/2008, 19h59
  2. [Tableaux] Découper une chaîne de caractères
    Par mix_35 dans le forum Langage
    Réponses: 5
    Dernier message: 17/03/2007, 02h06
  3. Découper une chaîne de caractères
    Par The Lord of Nesquik dans le forum C
    Réponses: 5
    Dernier message: 04/02/2007, 00h20
  4. [VBA-E] découper une chaîne de caractère
    Par jagwar dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/07/2006, 14h07
  5. Comment découper une chaîne de caractères en VBA
    Par TomPad dans le forum Access
    Réponses: 3
    Dernier message: 23/06/2005, 09h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo