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 :

Convertir chaine de caractère en float C#


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 Convertir chaine de caractère en float C#
    Bonjour,
    Je m'adresse à vous car depuis hier j'ai du mal à trouver la solution :
    Je m'explique, je reçois via une liaison série RS232 des caractères du type ("0r'r01jI+9F501") etc...
    c'est caractère sont envoyés par un scanner de proximité (SICK).
    Il me renvoie tout le temps les nouvelles détections de proximité (Valeur en float).
    Comment puis-je décoder ces informations et les traduire en type float ?

    Les caractères sont stockés dans une variable string puis affiché sur une Rich Text Box.
    J'aimerai les affichés en float toujours dans la RTB
    Je vous donne mon code "simplifié" pour récupérer les caractères en string :

    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
        public partial class Form1 : Form
        {
            internal delegate void SerialDataReceivedEventHandlerDelagate(Object sender, SerialDataReceivedEventArgs e); 
     
            SerialPort PortCom = new SerialPort();
            string InputData = string.Empty;
            delegate void SetTextCallback(string text);
     
            public Form1()
            {
                PortCom.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(port_DataReceived_1);
            }
     
     
            private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
            {
                InputData = PortCom.ReadExisting(); //Récupération des caractères 
     
                if (InputData != String.Empty)
                {
                    this.BeginInvoke(new SetTextCallback(SetText), new object[] { InputData });
                }
            }
     
            private void SetText(string text)
            {
               this.RTB_Data.Text += text; //Envoie les caractères dans la RTB 
            }
        }
    En vous remerciant.
    Cordialement,
    Steph

  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,

    tu veux transformer "0r'r01jI+9F501" en float, en prenant les bytes 4 par 4 ?
    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
    Alors là pour tout te dire je sais pas trop.
    Tout dépend de l'info envoyé par le SICK mais admettons, comment cela pourrait ce faire ?

  4. #4
    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
    Imaginons que ce soit ça alors :
    - tu dois récupérer des bytes et non une string sur ton port (avec la fonction Read(byte[], int, int) par exemple),
    - tu convertis ton tableau de bytes en float avec la fonction ToSingle(byte[], int) de BitConverter.
    Plus je connais de langages, plus j'aime le C.

  5. #5
    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
    J'ai essayé mais le programme plante directe,
    j'ai remplacé de cette façon :

    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
        public partial class Form1 : Form
        {
            internal delegate void SerialDataReceivedEventHandlerDelagate(Object sender, SerialDataReceivedEventArgs e); 
     
            SerialPort PortCom = new SerialPort();
            int InputData ;
    	float valFloat; 
    	byte[] valeur; 
     
            delegate void SetTextCallback(float val);
     
            public Form1()
            {
                InitializeComponent();
                PortCom.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(port_DataReceived_1);
            }
     
     
            private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
            {
                InputData = PortCom.Read(valeur, 0, 4); 
    	    valFloat = BitConverter.ToSingle(valeur, 0) 
     
                this.BeginInvoke(new SetTextCallback(SetText), new object[] { valFloat });
     
            }
     
            private void SetText(float val)
            {
               this.RTB_Data.Text += val; 
            }
         }

  6. #6
    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
    Ça plante où exactement ? InputData est bien égal à 4 après l'appel à Read ?
    Plus je connais de langages, plus j'aime le C.

  7. #7
    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
    En Debug, l'erreur est bien à InputData mais je n'ai pas accès à ça valeur. Il me semble que bizarrement ça valeur est null !
    Pour faire les Test j'envoie à l'aide d'un bouton une valeur de type "0r'r01jI+9F50" et ça reviens directement sur la Receptiion (Rx).
    Le code de l'envoie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            private void WriteSerial(object sender, EventArgs e)
            {
                if(PortCom.IsOpen) 
    	    {
    	        PortCom.Write("0r'r01jI+9F50")
    	   }
            }
    Je ne comprend donc pas qu'il ne recevrait rien ?
    Dès que j'appuie l'erreur ce fait et il m'indique InputData qui serait je pense "null"

  8. #8
    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
    Si InputData est null je pense que ça vient surtout du fait qu'une exception est levée, pas nécessairement que tu ne reçoit rien.
    Tu as un vrai plantage ou t'as quand même une information sur l'exception ? Au pire mets ton Read dans un try/catch pour en savoir un peu plus.
    Plus je connais de langages, plus j'aime le C.

  9. #9
    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 de faire le try-catch et quand je fait cela je n'ai plus d'erreur mais, dans ma RTB, à la place de mes 8 caractères,
    j'obtiens : 00000000.

    En gros comme si il voyait que des valeurs 'Null' en read :/

    Mon code changé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
            {
    	    try
                {
                   InputData = PortCom.Read(valeur, 0, 4); 
    	    }
     
                catch
                {
                    BeginInvoke(new SetTextCallback(SetText), new object[] { InputData.ToString() });
                }
     
            }
    J'essaye juste d'afficher déjà les bytes

  10. #10
    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
    Non, tu n'as plus d'erreur car l'exception qui faisait planter est prise en charge par ton try/catch Je te demandais cette gestion d'exception pour en savoir plus sur celle-ci. Mets un catch (Exception ex) et un point d'arrêt dans le block associé, tu auras alors plus d'info sur le plantage de ta fonction Read en déroulant ex dans la fenêtre espion.
    Plus je connais de langages, plus j'aime le C.

  11. #11
    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
    Il me dit que le Buffer ne peut pas être 'null'
    Par contre ce que j'observe qui est bizarre, c'est que ma variable byte[] valeur est souligné en vert en me disant que
    la variable n'est jamais assigné et possédera donc toujours sa valeur par default null alors
    que je l'ai assigné dans le try avec le InputData ?

  12. #12
    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
    Effectivement, c'est vrai que je me perds un peu avec le tout objet du .NET.
    Déclare ton tableau de bytes avec une taille pour réserver l'espace mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] buffer = new byte[4];
    Plus je connais de langages, plus j'aime le C.

  13. #13
    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
    Alors, bonne nouvelle je vois maintenant des chiffres à virgules !
    Mais c'est un chiffre à virgule pour chaque caractère est ce normal ?
    Les valeurs que je reçois ne sont pas cohérente,
    Je reçoit pour le caractère '2' du 7.006492E-44 , ça me parait très petit ^^ pour une valeur envoyé du SICK

  14. #14
    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'encodage du float en lui-même c'est 1 bit de signe, 8 bits d'exposant et 23 bits de mantisse dont un bit implicite ...
    Ça nous fait une belle jambe, je crois qu'on va faire confiance au framework .NET sur ce coup
    Et ne sachant pas ce qu'est un "scanner de proximité" ou un "SICK" je ne sais pas si c'est une valeur cohérente.

    Juste une petite remarque : comme un float fait 4 bytes il faudra sûrement 2 char pour avoir une valeur plus cohérente.
    Plus je connais de langages, plus j'aime le C.

  15. #15
    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 c'est sur tu as raison ^^,
    Dernière petite question et je t'embête plus, sur ta dernière remarque tu ferais une concaténation des deux caractères reçus à la suite ?
    En gros comment je peux faire pour avoir 2 caractères par 2 caractères ?

    En tous les cas je te remercie énormément, j'ai pus apprendre de nouvel chose et comprendre mes erreurs.

  16. #16
    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
    Ben en fait quand tu fais un Read d'une longueur de 4 bytes (dernier paramètre de la fonction) ça correspond à 2 char.
    En effet si tu fais un sizeof(char) tu verras qu'un char fait 2 bytes.
    Plus je connais de langages, plus j'aime le C.

  17. #17
    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 de remarquer que sur le capteur, il est possible qu'il renvoie aussi des valeurs entières mais dans les négatif et positif,
    j'ai trouvé la méthodes en faisant juste un bitconverter.ToInt,
    mais j'obtiens que des valeurs postive (celle du code ASCII de chaque caractère (De 0 à 255)
    je comprend pas comment avoir les valeurs négatives :/

  18. #18
    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
    Citation Envoyé par jopopmk Voir le message
    Ben en fait quand tu fais un Read d'une longueur de 4 bytes (dernier paramètre de la fonction) ça correspond à 2 char.
    En effet si tu fais un sizeof(char) tu verras qu'un char fait 2 bytes.
    Non un char fait un seul Octect ? de 0 à 255 donc 8bits non ?

  19. #19
    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
    En C un char fait un seul octet, mais il en fait 2 en C# (d'où ma référence au sizeof)
    Plus je connais de langages, plus j'aime le C.

Discussions similaires

  1. Réponses: 15
    Dernier message: 22/08/2012, 20h11
  2. Réponses: 8
    Dernier message: 23/04/2009, 17h57
  3. convertir chaine de caractère hexadecimale en image
    Par cotede2 dans le forum ImageJ
    Réponses: 1
    Dernier message: 20/04/2009, 16h15
  4. Convertir chaine de caractère en suite de codes ASCII
    Par mixka13 dans le forum Débuter
    Réponses: 7
    Dernier message: 20/11/2008, 17h05
  5. [VB.net 2005] convertir chaine de caractère en type 'date'
    Par kinganasius dans le forum Windows Forms
    Réponses: 1
    Dernier message: 18/07/2006, 23h14

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