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

Entrée/Sortie Java Discussion :

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


Sujet :

Entrée/Sortie Java

Vue hybride

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 15
    Par défaut Problème lors de l'envoi de données via laison 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, malheureusement, pour le moment je n'arrive à l'utiliser que pour transmettre le code ASCII de la valeur du paramètre que je souhaite modifier 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
    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);
     
        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) ;
     
    sgain.addChangeListener(new AuditeurSliderGain()) ;
     
    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);
                                     }
                }
        }
     
    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());
    out.write (+a);
    System.out.println(+a);
    out.close();
    serialPort.close();
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    }//fin constructeur
     
    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);*/
        }
    }

    En fait précisément : ce que je souhaiterais c'est qu'en bougeant mon Slider à +2 par exemple, alors la donnée envoyée soit bien une valeur qui vaut "2", et non "32" soit le code ascii du caractère 2.

    De plus : si j'essaye de passer en argument de TesteJavaComm un float plutôt qu'un int, alors la méthode "out.write(+a)" ne fonctionne plus. Cela voudrait-il dire que dans tout les cas en écrivant out.write j'envoie un caractère? Et que donc il existe une autre méthode que "write" qui existe et qui permette d'envoyer d'autres types de variables?

    Bonne soirée à tous, et merci à qui pourra se pencher sur mon problème!

  2. #2
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Le code envoyé est le code ascii du caractère sur la partie data du port com car tu utilises un PrintWriter sur le flux d'écriture du port. Tu pourrais ne pas l'utiliser et envoyer directement des octets pour plus de contrôle.

    Ensuite, sur le principe, pourquoi fermer le port à chaque fois et ne pas le laisser ouvert, disons pendant la "session de travail" avec le port ? Il suffit de garder une référence dessus ...

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 15
    Par défaut
    Salut, merci d'avoir pris la peine de répondre.
    En effet c'est exactement mon problème et je ne vois pas quoi utiliser d'autre que "PrintWriter" puis "out.write(argument)" pour envoyer des données sur le port COM.
    Comment passer un float ou int simplement?
    Merci, à plus peut-être!

  4. #4
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    En fait je me demande s'il est raisonnable d'écrire des int ou des float directement. L'encodage de ces types de données doit être interprété de la même manière de l'autre côté du port série, donc pas de problème si c'est un programme Java, mais si c'est du C attention.

    Note : je viens de découvrir les méthodes byteValue sur les Number :
    http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Float.html#byteValue()
    http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Integer.html#byteValue()
    Mais pour un Float, comment peut-on le convertir en un simple et unique byte il y a perte d'information non ?

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 15
    Par défaut
    effectivement, de "l'autre côté" (donc au niveau du microcontrôleur) la donnée va être interprétée en tant que "float". (en C)
    Mais après, un float est un float non?
    Ce que j'ai du mal à comprendre, c'est sous quelle forme est envoyée une donnée quelle qu'elle soit par le port série? un stream de byte?

    Sinon pour les méthodes que tu as dénichée, je suis dans le même cas que toi : coder un float sur un seul octet ??? quel sens donner à la valeur obtenue?? la précision? si je ne m'abuse, un float (comme un int) c'est 4 octets (4 bytes) soit 32bits
    le premier est le bit de signe
    les huits suivants correspondent à l'exposant
    les 23 derniers pour la "mantisse"...

    Si tu ramène tout ça à un seul octet, comment coder le signe, les chiffres après la virgule...

    Argh tout ce que je veux c'est en fixant mon slide à "2" que mon DSP le comprenne et dispose de cette variable "2"! et non une valeur étrange qui ne correspond pas, ou qui correspond à autre chose!

  6. #6
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Citation Envoyé par Rastaforien Voir le message
    Mais après, un float est un float non?
    Ben non justement, tout le problème est là ! Prenons un "int" par exemple, en C, il sera codé sur un nombre d'octets qui dépend de l'architecture de la machine : 16, 32 ou 64 bits ! Rajoute à ça les problématiques de nombres signés ou non signés (int / unsigned int), ou encore de little ou big endian (petit boutiste en français ), et tu verras qu'envoyer ces types de données entre un programme Java et C n'est pas si simple.

+ Répondre à la discussion
Cette discussion est résolue.

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, 12h10
  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, 22h44
  3. Problème lors de l'envoi de données via laision RS 232
    Par Rastaforien dans le forum Langage
    Réponses: 9
    Dernier message: 26/06/2008, 11h54
  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, 14h18
  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, 14h23

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