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 :

Obtenir chaine de caractère lors de la lecture SerialPort RS232


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 18
    Points : 6
    Points
    6
    Par défaut Obtenir chaine de caractère lors de la lecture SerialPort RS232
    Bonjour, le titre n'est pas très explicite mais je m'explique car c'est plus complexe.
    Je reçois sur une liaison RS232 en string le code suivant : "#2-00.135"
    Pour cela j'utilise ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string valeur = PortCom.ReadExisting();
    Puis je l'affiche sur une RichTextBox

    Ce que j'aimerai faire c'est afficher sur 3 RichTextBox différentes
    la valeur de l'adresse (#2), le signe du nombre decimal (-) et le nombre decimal(00.135).

    Il faut savoir qu'il y a un retour chariot à la fin du code donc cela fait en tout 10 octets.
    En gros la réception dans la RTB :
    #2-00.135(CR)
    #2-00.135(CR)
    #2-00.135(CR)

    Mon code pour mieux comprendre sans toutes les déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
           private void DataReceived(object sender, SerialDataReceivedEventArgs e)
           {
               Data = ComPort.ReadExisting();
               this.BeginInvoke(new SetTextCallback(SetText), new object[] { Data });
           }
     
           private void SetText(string text)
           {
               this.RTB_Reception.Text += text;
           }
    J'aurai besoin de votre aide
    Je vous remercie
    Cordialement,

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    alors en fait les float que tu cherchais la dernière fois c'était pas du binaire brut ?

    Pour ta question tu as les expressions régulières qui pourraient te faire le taff de manière propre.
    Maintenant on peut aussi faire ça "à la main" si on a quelques précisions :
    - quelle longueur peut avoir ce que tu appelles l'adresse ?
    - si la valeur décimale est positive l'expression a-t-elle un signe plus (+) en lieu et place du moins (-) ?
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Salut, Tu es toujours la toi =D,
    Alors pour la dernière fois on était plutôt sur du binaire brut, puis j'ai trouvé ma solution car enfaite la machine envoyé plusieurs donnée à la fois donc il fallait tout traité et c'était plus complexe que ça ^^

    Pour aujourd'hui enfaite la première valeur (adresse), ça peut être sois #1,#0 ou #2, tout dépend de la valeur que l'appareille envoie.
    Par exemple si il envoie la valeur X ce sera : #0-00.123 et si c'est Y ce sera : #1-00.451 etc...

    Pour le signe si il est positif, il n'y as pas de "+" mai un espace :/

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    bonjour

    beh tu splites ta chaine avec les fonctions de traitement de la classe String et on n'en parle plus
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  5. #5
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Oui, toujours là, ça me repose de venir ici entre 2 codes au taff ^^

    Comme dit TheMonz on peut effectivement utiliser un simple Split.

    Soit les 3 variables suivantes représentant ce que tu cherches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string address = "";
    bool isPositive = true;
    double absoluteValue = 0.0;
    Alors une méthode pour les remplir pourrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    string portComValue = "#2-00.35"; // un exemple de valeur
    string[] valTab = portComValue.Split('-');
    // on a 2 éléments : c'est qu'on a trouvé un moins
    if (valTab.Length == 2) isPositive = false;
    // sinon c'est une valeur positive : on split sur l'espace
    else valTab = portComValue.Split(' ');
    address = valTab[0];
    absoluteValue = Convert.ToDouble(valTab[1]);
    Plus je connais de langages, plus j'aime le C.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Oui mais comment ?,
    Car je ne sais pas si il m'envoie la chaine de caractère comme ça, c'est le fait qu'il y est un retour chariot qui me les alignes bien.
    Enfaite si il faut lui il m'envoie la chaine de caractère comme ça : (Je met CR pour retour chariot car c'est un octet que le matériel envoie pour aller à la ligne)

    string = "#01-00.165(CR)#01-00.065#01"
    Puis au deuxième envoie il met le reste etc...

    C'est ça que je sais pas :/

  7. #7
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Oui je connais CR (carriage return) même si je suis étonné qu'il t'envoie ce caractère pour un saut de ligne (sous Zindozs c'est CR + LF [line feed], sous Ninux c'est juste LF, mais je connaissais pas de système qui renvoyait juste CR).
    Sinon le code que je t'ai présenté reste valable du moment où tu extrais le bon morceau de texte, reste à extraire le bon morceau de texte ...

    Dans ton exemple il n'y a pas de saut de ligne entre la deuxième expression et le fragment de la troisème, c'est normal ou un oubli ?
    Dans l'interface que tu décris dans ton premier message, comment tu vois l'affichage de plusieurs expressions en même temps ?
    Enfin, comment fonctionne ton process d'écoute de l'input, histoire de voir comment gérer un buffer ?
    Plus je connais de langages, plus j'aime le C.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Je t'envoie, une photo de la réception avec un hyper Terminal quelconque, le mien fait pareil mais lui il affiche le (CR)
    Et je te donne la photo de mon application comme ça tu vois la disposition de l'affichage (X et Y)
    ces deux valeurs sont différentiées par la première valeur (adresse)
    Et pour ta dernière question, de cette façon dans le public form1() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    internal delegate void SerialDataReceivedEventHandlerDelagate(Object sender, SerialDataReceivedEventArgs e); 
     
            SerialPort PortCom = new SerialPort();
            delegate void SetTextCallback(string valeur);
     
            public Form1()
            {
                InitializeComponent();
                PortCom.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(port_DataReceived_1);
            }
    Puis la fonction qui traite cette événement :

    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
            private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
            {
                string InputData = PortCom.ReadExisting();
     
                BeginInvoke(new SetTextCallback(SetText), new object[] { InputData });
     
     
            }
     
            //Ecris les caractères sous la forme de INT
            private void SetText(string valeur)
            {
                this.RTB_Data.Text += valeur; 
     
            }

  9. #9
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Re,

    l'idée d'event va pas trop mal : tu reçois ta chaine, tu traites ce que tu peux et tu mets le reste de côté pour la prochaine réception.
    Le petit souci qu'il pourrait y avoir est en rapport au BeginInvoke. Si un traitement tarde un peu (pour une raison ou une autre) tu pourrais te retrouver avec un décalage.
    Petite question : peut-on considérer que le format de la valeur décimale est toujours identique (toujours 6 char s'entend) ?
    Plus je connais de langages, plus j'aime le C.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Re,

    Alors je t'envoie déjà les photos que j'ai oublié de mettre hier dans le message =D
    Et pour la valeur que me renvoie mon matériel oui on peut considéré que c'est toujours la même chose
    on aura toujours 00.123 ou autre mais toujours avec 6char. Nom : App_RS232.png
Affichages : 482
Taille : 18,8 Ko
    Nom : Exemple_Rx.png
Affichages : 308
Taille : 3,2 Ko

    Et si je délimite à chaque fois avec un split entre le caractère "-" ou " " et "cr" est ce possible ?

  11. #11
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Alors oui il va falloir splitter sur CR pour récupérer des expressions exploitables, mais il faut savoir reconnaitre si la dernière est complète ou non.
    Là, comme la valeur, le signe et l'adresse sont de longueurs fixes (respectivement 6 char, 1 char et 2 char) alors tu n'as qu'à tester la longueur (9 char) pour savoir si c'est le cas.

    Si on part du principe que le traitement est assez rapide pour qu'une nouvelle réception n'arrive pas avant sa fin, et que la chaine réceptionnée ne nous reserve pas de surprise, on peut imaginer :
    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
    // un attribut de classe pour conserver la partie non traitée car incomplète
    public string remainingPart = "";
     
    // la fonction qui traite une expression formatée #x-00.000, je la réécris pas c'est celle que j'ai donnée plus tôt
    public void TreatExpression(string expression);
     
    // la fonction appelée par le BeginInvoke
    public void TreatData(string recievedData) {
        // on split la data concaténée à notre reste sur le saut de ligne pour séparer les expressions
        string[] exprs = (remainingPart + recievedData).Split('\r');
        // pour chaque expression trouvée
        foreach(string expr in exprs)
            // on a une expression complète : on la traite
            if (expr.Length == 9) TreatExpression(expr);
            // l'expression est incomplète : on la sauve pour plus tard
            else remainingPart = expr;
    }
    Ce code n'est pas franchement optimisé, on va laisser le compilo faire son job.
    Plus je connais de langages, plus j'aime le C.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Je viens d'essayer et j'ai une erreur dans ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    string portComValue = "#2-00.35"; // un exemple de valeur
    string[] valTab = portComValue.Split('-');
    // on a 2 éléments : c'est qu'on a trouvé un moins
    if (valTab.Length == 2) isPositive = false;
    // sinon c'est une valeur positive : on split sur l'espace
    else valTab = portComValue.Split(' ');
    address = valTab[0];
    absoluteValue = Convert.ToDouble(valTab[1]);
    L'erreur ce trouve à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    absoluteValue = Convert.ToDouble(valTab[1]);
    Enfaite pour les test c'est moi qui envoie la valeur à retourner dans Rx
    Si j'envoie une fois parfaitement ça : "#2-00.001(cr)"
    Tout fonctionne, mais si je l'envoie une deuxième fois aprés pour voir si il m'affiche bien la valeur
    j'ai cette erreur :

    L'index se trouve en dehors des limites du tableau

  13. #13
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    L'erreur vient du fait que ta CultureInfo doit attendre un ',' et non un '.' pour le séparateur de décimale.
    (attention, mon exemple pour la première fonction contient une valeur sur seulement 5 char)

    Pour l'erreur d'après c'est le split qui n'est pas bon, il me faudrait le code complet pour essayer de comprendre où ça marde.
    Plus je connais de langages, plus j'aime le C.

Discussions similaires

  1. Ignorer des caractères lors d'une lecture fichier
    Par Inaky dans le forum Langage
    Réponses: 9
    Dernier message: 06/11/2011, 15h25
  2. [PHP 5.3] Perte de caractères lors d'une lecture de fichier
    Par Vince57 dans le forum Langage
    Réponses: 2
    Dernier message: 28/08/2010, 19h03
  3. Réponses: 4
    Dernier message: 25/05/2010, 17h59
  4. Réponses: 3
    Dernier message: 26/04/2010, 17h30
  5. Réponses: 0
    Dernier message: 12/10/2009, 15h58

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