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

avec Java Discussion :

[RXTX] Communiquer sur le port série [Débutant(e)]


Sujet :

avec Java

  1. #1
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut [RXTX] Communiquer sur le port série
    Bonjour,

    Java n'est pas un langage que je maîtrise très bien mais j'en ai besoin pour communiquer via un port Série avec une balance de Sartorius et un indicateur Midrics 2. En me basant sur un wiki de RXTX sur la communication avec un post série, j'en suis arrivé à ce code :

    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
    import gnu.io.CommPort;
    import gnu.io.CommPortIdentifier;
    import gnu.io.SerialPort;
     
    import java.io.FileDescriptor;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
     
    public class TwoWaySerialComm {
        public TwoWaySerialComm() {
            super();
        }
     
        void connect(String portName) throws Exception {
            CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
            if(portIdentifier.isCurrentlyOwned()) System.out.println("Error: Port is currently in use");
            else {
                CommPort commPort = portIdentifier.open(this.getClass().getName(), 2000);
     
                if(commPort instanceof SerialPort) {
                    SerialPort serialPort = (SerialPort) commPort;
                    serialPort.setSerialPortParams(57600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
                    serialPort.notifyOnDataAvailable(true);
     
                    InputStream in = serialPort.getInputStream();
                    OutputStream out = serialPort.getOutputStream();
     
                    (new Thread(new SerialReader(in))).start();
                    (new Thread(new SerialWriter(out))).start();
                }
                else System.out.println("Error: Only serial ports are handled by this example.");
            }     
        }
     
        /** */
        public static class SerialReader implements Runnable {
            InputStream in;
     
            public SerialReader(InputStream in) {
                this.in = in;
            }
     
            public void run() {
                byte[] buffer = new byte[1024];
                int len = -1;
                try {
                    while((len = this.in.read(buffer)) > -1) {
                        System.out.print(new String(buffer,0,len));
                    }
                }
                catch ( IOException e ) {
                    e.printStackTrace();
                }            
            }
        }
     
        /** */
        public static class SerialWriter implements Runnable {
            OutputStream out;
     
            public SerialWriter(OutputStream out) {
                this.out = out;
            }
     
            public void run() {
                try {                
                    int c = 0;
                    while(( c = System.in.read()) > -1) {
                        this.out.write(c);
                    }                
                }
                catch(IOException e) {
                    e.printStackTrace();
                }            
            }
        }
     
        public static void main(String[] args) {
            try {
                (new TwoWaySerialComm()).connect("COM7");
            }
            catch(Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    Rendu là, j'ignore totalement quoi faire pour réussir à lire le poids mesuré par la balance ou pour écrire sur le port série vers la balance. J'ignore actuellement si c'est en raison de mon peu de connaissance en la matière ou parce qu'il me manque d'information sur le mode de fonctionnement de l'interface de la balance. J'ai donc contacté le service technique de Sartorius et je lance ce billet en parallèle pour savoir si quelqu'un aurait une suggestion à me faire pour me permettre de débloquer. Je présume que, pour un développeur Java plus expérimenté, ce code parle beaucoup plus qu'à moi.
    Pensez à la balise

  2. #2
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut
    Ok je simplifie la question : Comment dois-je faire pour écrire "P" dans l'OutputStream du port COM?
    Pensez à la balise

  3. #3
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut
    Selon mes recherches, je n'aurais qu'à envoyer le caractère ASCII "P" dans le OutputStream et je recevrais la donnée que je recherche. Je ne peux pas croire que personne ici ne peux m'aider à réaliser cela?
    Pensez à la balise

  4. #4
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    Citation Envoyé par FrankOVD Voir le message
    Selon mes recherches, je n'aurais qu'à envoyer le caractère ASCII "P" dans le OutputStream et je recevrais la donnée que je recherche. Je ne peux pas croire que personne ici ne peux m'aider à réaliser cela?
    As tu codé quelque chose ? car ce que tu montre c'est juste un copier collé de ce que tu as trouvé sur le site !
    Developpez est un site permettant l'entraide, il est pas fait que l'on fasse le travaille a ta place.

    Maintenant tu as pas mal de ressources ici, en voici quelques exemple :
    - FAQ Fichiers, flux et réseaux
    - Penser en Java - Le système d'E/S de Java
    - Développons en Java - Les flux
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut
    Malgré les apparences ça fait quelques semaines que je retourne dans cette classe pour essayer de trouver comment faire fonctionner la communication. Malheureusement jamais rien ne fonctionne alors...

    Et les fonctions et classes de mon application qui ne sont pas pertinentes n'ont pas été incluses inutilement dans mon extrait de code.

    Ça fait plus de 10 ans que je n'ai pas touché à Java et je comprend mal le "scope" des variables, j'ignore totalement comment récupérer la variable "out" définie dans SerialWriter() pour y écrire dans main() ou comment utiliser SertialWriter() pour que cette fonction écrive dans "out". C'est que SerialWriter attend une variable de type OutputStream et le reçoit de la fonction connect alors tout ce code ne me semble pas pour moi créer d'ouverture pour écrire dans l'OutputStream et je travaille à tâtons. Si c'était du PHP, je serais déjà à des années lumières de là mais pour ce bout de code j'ai besoin de Java.

    Alors voyez-vous je me suis penché sur ce code en longueur et c'est ce que la documentation de RXTX dit être un code de communication bidirectionnelle sur le port RS232 alors je les crois, mais je ne comprend pas de où partir. Une fois cela fait et lorsque j'aurai reçu une chaîne ASCII, je pourrai faire le reste du travail sans problème. C'est que réussir quelque chose d'aussi pointu dans un langage qu'on ne connait pas sans le moindre coup de pouce est difficile.

    Alors, allez-vous me donner ce coup de pouce?
    Pensez à la balise

  6. #6
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    Voila quelques infos de ce que je comprend !
    Pour commencer la connexion est ouverte dans "connect" avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
    Ensuite tu récupères les flux d'E/S :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    InputStream in = serialPort.getInputStream();
    OutputStream out = serialPort.getOutputStream();
    Maintenant tu as tout les éléments pour lire et écrire sur le port serie !
    le reste ne fait que montrer comment écrire dans la console ce qui est lu en entrée (le in) et comment envoyer des données saisies par l'utilisateur en sortie (le out).
    Si tu souhaites utiliser le out dans une classe ou une autre méthode alors il te suffit de le passer en paramètre comme c'est le cas dans SerialWriter.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut
    Donc j'en conclus que je dois utiliser directement la fonction run() de la classe SerialWriter pour faire mon écriture. Pour fins de tests et parce que je ne suis pas trop certain de savoir comment il serait possible d'appeler cette fonction à partir de la fonction main(), j'ai choisi de modifier pour l'instant ma fonction run(), ce qui donne ceci :

    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
        public static class SerialWriter implements Runnable {
            OutputStream out;
     
            public SerialWriter(OutputStream out) {
                this.out = out;
            }
            public void run() {
                try {   
                    char character = 'P';
                    int ascii = (int) character;
                    this.out.write('P');
                    System.out.print("Envoi");
                    System.exit(-1);
                }
                catch(IOException e) {
                    e.printStackTrace();
                    System.exit(-1);
                }      
            }
        }
    Le mot "Envoi" ne s'affiche pas dans la console. En fait, rien de nouveau ne s'écrit dans la console, pas même une erreur. Alors je ne sais pas trop quoi en conclure. Cependant, j'ai une erreur lorsque j'essaie de relancer le test malgré le fait qu'aucune instance de java ne soit restée dans la liste des processus actifs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gnu.io.PortInUseException: Unknown Application
    	at gnu.io.CommPortIdentifier.open(CommPortIdentifier.java:354)
    	at TwoWaySerialComm.connect(TwoWaySerialComm.java:21) //CommPort commPort = portIdentifier.open(this.getClass().getName(), 2000);
    	at TwoWaySerialComm.main(TwoWaySerialComm.java:123) //(new TwoWaySerialComm()).connect("COM7");
    Est-ce que j'avance dans la bonne direction ou je refroidis?
    Pensez à la balise

Discussions similaires

  1. Communiquer sur le port série
    Par stephdemars dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 29/04/2009, 09h58
  2. Réponses: 3
    Dernier message: 23/03/2005, 14h25
  3. [Kylix] Lecture sur le port série en C++
    Par MD Software dans le forum EDI
    Réponses: 1
    Dernier message: 08/05/2004, 12h52
  4. Quel langage choisir pour lire sur le port série ?
    Par Nico76 dans le forum Windows
    Réponses: 7
    Dernier message: 28/04/2004, 10h42
  5. Réception sur le port série sous DOS avec Borland V3.0
    Par jackyjacky dans le forum Autres éditeurs
    Réponses: 24
    Dernier message: 19/03/2004, 23h18

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