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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    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
    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
    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 (-) ?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    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
    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
    Par défaut
    bonjour

    beh tu splites ta chaine avec les fonctions de traitement de la classe String et on n'en parle plus

  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
    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]);

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    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
    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
    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 ?

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    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
    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; 
     
            }

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, 16h25
  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, 20h03
  3. Réponses: 4
    Dernier message: 25/05/2010, 18h59
  4. Réponses: 3
    Dernier message: 26/04/2010, 18h30
  5. Réponses: 0
    Dernier message: 12/10/2009, 16h58

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