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

Langage Java Discussion :

Problème lors de l'envoi de données via laision RS 232


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 15
    Points : 3
    Points
    3
    Par défaut Problème lors de l'envoi de données via laision RS 232
    Bonjour à tous, et tout d'abord merci et bravo pour ce site communautaire qui pour ma part m'a déjà sorti de beaucoup de soucis, et qui a du en aider déjà plus d'un!
    Justement jusqu'à présent j'ai toujours réussi à m'en sortir avec les posts laissés ici, mais aujourd'hui je me permet d'envoyer ma question :

    J'utilise une interface graphique développée en JAVA afin de communiquer avec un micro-contrôleur via la liaison série du PC (en RS232).

    Grosso modo il y a sur cette IHM quelques Sliders qui permettent de régler des paramètres qui sont transmis au DSP.

    J'ai trouvé grâce à un excellent tutorial comment gérer le dialogue avec le port COM, malheureusment, pour le moment je n'arrive à l'utiliser que pour transmettre le code ASCIIde la valeur du paramètre que je souhaite modifer grâce à mon Slider. A l'aide d'un soft gratuit (Free Serial Port Monitor) je peux espionner ce qu'il se passe sur le port COM : il "affiche" bien la valeur souhaitée mais ne transmet que le code ASCII.

    Sinon ma deuxième question est moins ciblée, d'ordre plus global : lors d'une communication avec le port série, pour le moment je n'y suis parvenu qu'en faisant une procédure du style : détection d'un mouvement sur un slider->récupération de la valeur->ouverture du port COM->envoi donnée (son code ASCII malheureusement!)->fermeture du port COM. Et dès lors que le slide passe au "tick" suivant, rebelotte : récupération de la valeur, ouverture du port, envoi puis fermeture. Cela vous semble-t-il logique, vous autres familiers de ce bon vieux port série (je découvre totalement son usage, excusez mes questions naïves).

    Voici le code que j'utilise :


    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
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    package ControleActif_1_SLIDER;
     
    import java.awt.GridBagConstraints ;
    import java.awt.GridBagLayout ;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.* ;
    import javax.swing.event.ChangeEvent ;
    import javax.swing.event.ChangeListener ;
    import javax.comm.*;
    import java.io.*;
    import java.util.*;
     
     
    public class Main1Slider extends JPanel{
     
        JLabel val_gain, val_puls, val_facteur, val_delay ;
     
        JSlider sgain, spuls, sfacteur, sdelay ;
     
        JLabel TexteGain, TextePuls, TexteFacteur ;
     
        JButton boutonreset;
     
     
    public Main1Slider() {
     
        super() ;
     
     
        sgain = new JSlider() ;
        spuls = new JSlider() ;
        sfacteur = new JSlider() ;
        sdelay = new JSlider() ;
     
        boutonreset = new JButton("Mise à zéro");
     
        sgain.setMinimum(-50) ;
        sgain.setMaximum(50) ;
        sgain.setValue(0) ;
        sgain.setMajorTickSpacing(10) ;
        sgain.setMinorTickSpacing(5) ;
        sgain.setPaintTicks(true) ;
        sgain.setPaintLabels(true);
     
        spuls.setMinimum(-50) ;
        spuls.setMaximum(50) ;
        spuls.setValue(0) ;
        spuls.setMajorTickSpacing(10) ;
        spuls.setMinorTickSpacing(5) ;
        spuls.setPaintTicks(true) ;
        spuls.setPaintLabels(true);
     
        sfacteur.setMinimum(-50) ;
        sfacteur.setMaximum(50) ;
        sfacteur.setValue(0) ;
        sfacteur.setMajorTickSpacing(10) ;
        sfacteur.setMinorTickSpacing(5) ;
        sfacteur.setPaintTicks(true) ;
        sfacteur.setPaintLabels(true);
     
        sdelay.setMinimum(-50) ;
        sdelay.setMaximum(50) ;
        sdelay.setValue(0) ;
        sdelay.setMajorTickSpacing(10) ;
        sdelay.setMinorTickSpacing(5) ;
        sdelay.setPaintTicks(true) ;
        sdelay.setPaintLabels(true);
     
     
     
        val_gain = new JLabel("%"+sgain.getValue()) ;
        val_puls = new JLabel("%"+spuls.getValue()) ;
        val_facteur = new JLabel("%"+sfacteur.getValue()) ;
        val_delay = new JLabel("%"+sdelay.getValue());
     
        TexteGain = new JLabel("Modification du Gain :") ;
        this.setLayout(new GridBagLayout()) ;
        GridBagConstraints c = new GridBagConstraints() ;
        c.fill = GridBagConstraints.BOTH;
        c.anchor=GridBagConstraints.LINE_START ;
     
        c.gridx=0 ;
        c.gridy=0 ;
        this.add(TexteGain,c) ;
        c.gridx=1 ;
        c.gridy=0 ;
        c.anchor = GridBagConstraints.CENTER ;
        this.add(sgain,c) ;
        c.gridx=2 ;
        c.gridy=0 ;
        c.anchor=GridBagConstraints.LINE_END;
        this.add(val_gain,c) ;
     
        c.gridx=0 ;
        c.gridy=1 ;
        c.anchor=GridBagConstraints.LINE_START ;
        this.add(new JLabel("Modification de la pulsation : "),c) ;
        c.gridx=1 ;
        c.gridy=1 ;
        c.anchor = GridBagConstraints.CENTER ;
        this.add(spuls,c) ;
        c.gridx=2 ;
        c.gridy=1 ;
        c.anchor=GridBagConstraints.LINE_END;
        this.add(val_puls,c) ;
     
        c.gridx=0 ;
        c.gridy=2 ;
        c.anchor=GridBagConstraints.LINE_START ;
        this.add(new JLabel("Modification du facteur de qualité : "),c) ;
        c.gridx=1 ;
        c.gridy=2 ;
        c.anchor = GridBagConstraints.CENTER ;
        this.add(sfacteur,c) ;
        c.gridx=2 ;
        c.gridy=2 ;
        c.anchor=GridBagConstraints.LINE_END;
        this.add(val_facteur,c) ;
     
        c.gridx=0 ;
        c.gridy=3 ;
        c.anchor=GridBagConstraints.LINE_START ;
        this.add(new JLabel("Modification du Delay : "),c) ;
        c.gridx=1 ;
        c.gridy=3 ;
        c.anchor = GridBagConstraints.CENTER ;
        this.add(sdelay,c) ;
        c.gridx=2 ;
        c.gridy=3 ;
        c.anchor=GridBagConstraints.LINE_END;
        this.add(val_delay,c) ;
     
        c.gridx=1 ;
        c.gridy=4 ;
        c.anchor = GridBagConstraints.CENTER ;
        this.add(boutonreset,c) ;
     
     
        sgain.addChangeListener(new AuditeurSliderGain()) ;
        spuls.addChangeListener(new AuditeurSliderPuls()) ;
        sfacteur.addChangeListener(new AuditeurSliderFacteur()) ;
        sdelay.addChangeListener(new AuditeurSliderDelay());
     
        boutonreset.addActionListener(new ActionBoutonReset());
     
                }
     
     
    private class AuditeurSliderGain implements ChangeListener{
            public void stateChanged(ChangeEvent arg0) {
            if (sgain.isFocusOwner()){
            int valeurGAIN = 0 ;
     
            val_gain.setText("%"+sgain.getValue()) ;
     
            valeurGAIN = sgain.getValue();
     
            System.out.println("YO H0!"+valeurGAIN) ;
            new TesteJavaComm("COM1",valeurGAIN);
                                     }
                }
        }
     
     
    private class AuditeurSliderPuls implements ChangeListener{
        public void stateChanged(ChangeEvent arg0) {
            if (spuls.isFocusOwner()){
            int valeurPULS = 0 ;
     
            val_puls.setText("%"+spuls.getValue()) ;
     
            valeurPULS = spuls.getValue();
     
            System.out.println("YO w0!"+valeurPULS) ;
            new TesteJavaComm("COM1", valeurPULS);
                                     }               
                }
    }
     
    private class AuditeurSliderFacteur implements ChangeListener{
        public void stateChanged(ChangeEvent arg0) {
            if (sfacteur.isFocusOwner()){
            int valeurFACTEUR = 0 ;
     
            val_facteur.setText("%"+sfacteur.getValue()) ;
            valeurFACTEUR = (char) sfacteur.getValue();
     
            System.out.println("YO Q!"+valeurFACTEUR) ;
            new TesteJavaComm("COM1", valeurFACTEUR);
                                        }
                  }
    }
     
    private class AuditeurSliderDelay implements ChangeListener{
        public void stateChanged(ChangeEvent arg0) {
            if (sdelay.isFocusOwner()){
            int valeurDELAY = 0 ;
     
            val_delay.setText("%"+sdelay.getValue()) ;
            valeurDELAY = sdelay.getValue();
     
            System.out.println("YO DELAY!"+valeurDELAY) ;
            new TesteJavaComm("COM1", valeurDELAY);
                                 }
                }
    }
     
     
     
    private class ActionBoutonReset implements ActionListener{
            public void actionPerformed(ActionEvent e) {
                if (e.getSource()==boutonreset)
                {
                System.out.println("PAS YO!") ;
                sdelay.setValue(0) ;
                val_delay.setText("%"+sdelay.getValue()) ;
                sgain.setValue(0) ;
                val_gain.setText("%"+sgain.getValue()) ;
                spuls.setValue(0) ;
                val_puls.setText("%"+spuls.getValue()) ;
                sfacteur.setValue(0) ;
                val_facteur.setText("%"+sfacteur.getValue()) ;
                }
        }
    }
     
     
     
    /*
    Cette classe permet de tester les ports séries disponibles
    en les listant puis en créant un stream d'entrée et de sortie
    */
    public class TesteJavaComm
    {
    CommPortIdentifier portId;
    BufferedReader in;
    PrintWriter out;
    SerialPort serialPort;
     
     
     
     
    /*
    Constructeur de la classe TesteJavaComm qui prend en paramètre le port série à utiliser.
    Dans un premier temps on liste les ports disponibles sur le pc
    */
    public TesteJavaComm (String com, int a)
    {
    System.out.println("listage des ports série disponibles:");
    //listePortsDispo();
    try
    {
    //ouverture du port série:
    portId=CommPortIdentifier.getPortIdentifier(com);
    serialPort=(SerialPort)portId.open("Envoi",2000);
     
     
    //on sélectionne tous les paramètres de la connexion série:
    serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
    System.out.println("Ouverture du port"+com);
     
    //pour lire et écrire avec des streams:
    in=new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
    out=new PrintWriter(serialPort.getOutputStream());
     
     
    //Teste de lecture/ecriture sur le port série
     
     
    /*int ASCII = (new Character(a)).hashCode();
    String CHAINE = Integer.toBinaryString(ASCII);*/
     
    //String originalText="une chaine de caractere";
    //outputArray = originalText.getBytes( );
    out.write (""+a);
    //out.write ( outputArray, 0 , length);
    //in.close();
    out.close();
    serialPort.close();
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    }//fin constructeur
     
     
     
     
    /*public void listePortsDispo()
    {
    System.err.println("recherche...");
    Enumeration portList=CommPortIdentifier.getPortIdentifiers();
    if (portList==null)
    {
    System.err.println("Aucun port de communication détecté");
    return;
    }
    while (portList.hasMoreElements())
    {
    portId=(CommPortIdentifier)portList.nextElement();
    System.out.println("* "+portId.getName());
    } // while
    } //fin de la methode listePortsDispo()*/
        }
     
     
     
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException,
    IllegalAccessException, UnsupportedLookAndFeelException 
        {
    // En decommantant la ligne suivante, l’interface prend le ”look-and-feel”
    //du systeme d’exploitation
        //UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName()) ;
        JFrame fen = new JFrame("Contrôle Actif appliqué au chevalet de violon") ;
        fen.setResizable(true) ;
        fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
        fen.setContentPane(new Main1Slider()) ;
        fen.pack() ;
        fen.setVisible(true) ;
        char lettre = 'a';
        int monAsci = (new Character(lettre)).hashCode();
        String binaryString = Integer.toBinaryString(monAsci);
        System.out.println(binaryString);
        }
    }
    Je vous remercie tous d'avance pour une idée de ce que je fais mal!

    Bonne journée à tous, en espérant qu'une éventuelle résolution de ce problème (que j'espère simple pour un habitué) puisse servir par la suite à quiconque confronté au même souci!

    Nicolas

  2. #2
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Hello,

    Essaie de faire un peu de nettoyage dans le code avant de poster, on n'a pas besoin de savoir comment tu as créé la JFrame quand ton problème concerne le port série.

    Quel est ton problème avec le "code ASCII" exactement ? tu fais out.write (""+a); donc tu envoie une chaîne de caractères contenant la valeur de a. Si tu voulais envoyer l'octet au contraire il faut utiliser out.write(a).

    Pour l'utilisation du port, je te conseille d'ouvrir le port au début de l'application et de le conserver ouvert jusqu'à la fermeture. En effet vu le temps qu'il faut pour s'attribuer et ouvrir un port, la réactivité de ton appli risque d'en prendre un coup si tu ouvres un port à chaque déplacement d'un slider !

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 15
    Points : 3
    Points
    3
    Par défaut
    Merci pour la réponse!

    Effectivement, j'ai balancé tout le code mais seule la classe JavaTesteComm suffisait.

    Effectivement, le problème vient de là : out.write(""+a). Mais également du fait de déclarer "out" en tant que PrintWriter visiblement (ce qui ne permet pas d'envoyer de flots de bits, cf doc javasun).

    Il faut déclarer out plutôt en tant que "DataOutputStream". (qui permet l'envoi de données brutes).

    Par contre, il me reste quelques soucis : lorsque tu me conseille de laisser le port ouvert, c'est ce que j'ai tenté initialement. Mais sans succès : en effet tel que je m'y suis pris à l'origine, l'ouverture du port se faisait lors d'un déplacement d'un Slider, mais (si l'on ne referme pas le port), au déplacement suivant, je reçois une erreur "Port owned by "Envoi"".
    Alors : je veux bien laisser le port ouvert, mais comment se sortir de ce problème selon toi?

    Sinon as-tu entendu parler de problème de passage de variable d'un langage à un autre? Je m'explique, sur un autre post, quelqu'un m'a dit qu'il pouvait y avoir des problèmes lors du passage d'une variable en JAVA à un programme en C (le valeurs que j'envoie sur le port série sont en fait récupérée par un microcontrôleur qui lui est géré en C).
    Bonne journée, bon courga epour cette nouvelle semaine!

  4. #4
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Dans tes listeners, au lieu de créer une instance de "TestComm" à chaque fois, passe plutôt l'OutputStream. Tu ouvres le stream au début du programme, et tu le passes aux listeners dans leur constructeur.

    Pour la passage de variables de Java à C, a priori ça devrait marcher tout seul si tu fais bien attention à l'ordre des octets ... Une difficulté que je vois est que certains types de flux appliquent automatiquement un encoding, tu te retrouverais alors avec des "?" ou des séquences UTF-8 dans tes données ... Si tu as un problème, regarde par là

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 15
    Points : 3
    Points
    3
    Par défaut
    Salut, merci pour les réponses!

    En fait je suis arrivé à une version qui fonctionne (et le DSP réagit comme voulu). cf. un post dans "IO" qui a le même titre que cette discussion

    En revanche suis bien intéressé par une optimisation :
    quand tu dis "ouvre le stream au début du programme" : tu veux dire "new TesteJavaComm au niveau de Main_1Slider où au niveau de "static void main"?

    Ensuite, "passe l'outputstream" au niveau des listeners, tu entends par là "out.write(blabla)"?? directement. Mais telle qu'est faite TesteJavaComm, il faut lui passer 2 argument, dont la valeur récupérée au niveau du Slider : comment faire?

    Et sinon j'ai une autre petite question : mettons que les valeur des sliders "valeurGAIN, valeurDELAY", etc, soit des floats : puis-je avoir accès à une version de ces variables écrites sous forme binaire?
    Je souhaiterais aller fixer les deux derniers bits de la mantisse pour une phase d'identification du paramètre envoyé au niveau du DSP : je perd pas trop en terme de précision normalement (ça serait le 10ème chiffre après la virgule normalement, ou quelque chose par là)
    Que penses-tu de cette méthode? et surtout comment avoir accès aux bits de mon float?

    Merci à toi, bonne journée à la prochaine!

  6. #6
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Hello,

    Pour ton problème de port série, effectivement il faudrait revoir la classe de gestion du port série. J'imaginais quelquechose de ce genre : D'abord initialiser le port série et le flux de sortie, et en conserver une référence : (j'écris en pseudo-code)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    serialPort = initSerialPort("COM1");
    outStream = serialPort.getOutputStream();
    Ensuite au niveau des listeners tu passes ce flux de sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sgain.addChangeListener(new AuditeurSliderGain( outStream )) ;
    spuls.addChangeListener(new AuditeurSliderPuls( outStream )) ;
    Dans le corps des listeners, conserver le outStream dans un champ et l'utiliser dans la méthode stateChanged().

    Bon dis moi si ça n'est pas assez détaillé j'essaierai de faire mieux

    Ensuite pour le format des données, tu ne peux écrire dans ce flux que des bytes. Toutes données seront auparavant converties en bytes ou tableaux de bytes. Par exemple, si tu essaies d'envoyer le float 42.3456, il sera converti en byte (cast) et tu obtiendras seulement l'octet 42 dans ton flux.

    Pour envoyer des données plus complexes il faut les convertir dans un format intermédiaire que ton programme et le DSP comprendront. Le plus simple est probablement de convertir le nombre en texte, et d'envoyer ce texte par le port série. Le DSP devra reconvertir le texte en un nombre.

    càd : 42.3456 coté Java -> "42.3456" sur la liaison série -> 42.3456 coté DSP
    Exemple du code java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String chaine = String.valueOf(42.3456);
    out.write(chaine.getBytes());
    Comment codes tu sur le DSP ? Si c'est en C, il y a des fonctions comme atof et atoi qui permettent de convertir une chaîne de caractères en un nombre.

    Tu peux aussi ajouter à la chaîne envoyée une info qui indique à quel registre correspond la donnée.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 15
    Points : 3
    Points
    3
    Par défaut
    Merci Vic!
    Avec les deux lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sgain.addChangeListener(new AuditeurSliderGain( outStream )) ;
    spuls.addChangeListener(new AuditeurSliderPuls( outStream )) ;
    je comprend maintenant mieux comment m'y prendre, merci pour ça!

    Pour ce qui est de l'envoi directement de données brutes, genre envoyer un float directement qui soit interprété par le DSP correctement, il me semble avoir déjà contourner ce problème en utilisant "DataOutputStream"
    Attention cependant aux problèmes d'endianess (ce que j'ai découvert à mes dépends!)
    JAVA envoie les données type BigEndian, alors que le DSP (dont le prog est en C effectviement) lui est en Little Endian. Il m'a fallu prévoir une "inversion" au niveau du prog en JAVA des données que j'envoie, afin de faire comprendre au DSP ce qu'il recoit (et à ce propos, j'essaye de faire un maximum d'étapes au niveau du prog en JAVA car j'essaie d'allèger au maximum le DSP)

    Sinon, à part "convertir en chaine de caractère" est-il possible selon toi à partir d'un float d'avoir accès à son écriture sous forme binaire, ou octale? genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    float a=42.125
    b=a.getBytes() ou .getBits
    j'ai pas vraiment fouillé dans l'aide javasun pour le moment à ce niveau là, mais je me permet de te demander tout de suite si éventuellement tu as une idée.
    Mon but serait d'avoir 42.125 écrit en binaire : je sais pas exactement ce que ça donne, mais ce afin de pouvoir aller fixer les derniers bits de ma mantisse.
    J'avais trouvé un moyen de récupérer sous forme binaire mon float, mais lorsque je lui faisait faire une opération logique au lieu de modifier certains bits, il "rajoutait" des bits au bout. Je sais pas si tu vois ce que je veux dire?
    Malheureusement ajrdhui suis à la maison et je n'ai pas mon code sous la main. Je ne peux pas te montrer ce que j'avais testé et ce qui foirait.
    Bref! Dans tout les cas merci de t'être penché sur mon problème, c'est vraiment très sympa. C'est pourquoi ne te casse pas la tête pour ce dernier soucis de bits à récupérer : en fouillant sur javasun il y a forcément une méthode qui existe pour récupérer la forme binaire d'une variable de type float

  8. #8
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Hello,

    content de voir que ça avance

    Pour récupérer les bits d'un float, jette un coup d'oeil aux méthodes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Float.floatToIntBits(float value)
    Float.floatToRawIntBits(float value)
    http://java.sun.com/j2se/1.5.0/docs/...ang/Float.html

    Il y a le même genre de méthodes sur Double : http://java.sun.com/j2se/1.5.0/docs/...ng/Double.html

    Ces méthodes te renvoient un int ou un long qui correspond aux bits du float ou du double, et tu peux les manipuler avec les opérateurs binaires. Je pense que DataOutputStream utilise ces méthodes.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 15
    Points : 3
    Points
    3
    Par défaut
    Merci vic une fois de plus pour tes réponses.

    Aurais-tu la même méthode qui permette de reformer un float après cette conversion et une éventuelle opération binaire?

    i.e. :
    1) J'ai un float F;
    2) Conversion sous forme binaire B;
    3) Opération binaire sur B;
    4) Retour à un float F' qui correspond à B? (soit F modifié quoi)

    Merci encore!

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 15
    Points : 3
    Points
    3
    Par défaut
    OK Vic!
    Ce problème final est réglé grâce à

    Float.intBitsToFloat()

    trouvé d'ailleurs qq lignes après celles de floatToIntBits dans l'aide javasun.

    Merci Vic!

    Bonne journée à tous

Discussions similaires

  1. Problème lors de l'envoi de données entre servlet et JSP
    Par julia_m dans le forum Servlets/JSP
    Réponses: 44
    Dernier message: 23/08/2012, 13h10
  2. Problème lors de l'envoi de données de flash à un script PHP
    Par Winchack dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 25/09/2008, 23h44
  3. Problème lors de l'envoi de données via laison RS 232
    Par Rastaforien dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 23/06/2008, 17h36
  4. [SQL] Pb Sql lors de l envoie des données via un formulaire
    Par xtiand4 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/06/2006, 15h18
  5. erreur lors de l'envoie de donné via les socket.
    Par poporiding dans le forum C++
    Réponses: 1
    Dernier message: 23/05/2006, 15h23

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