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 :

Lecteur de glycémie & port Série !


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 3
    Par défaut Lecteur de glycémie & port Série !
    Bonjour à tous,

    diabétique depuis quelques années, je cherche à me développer une application en JAVA pour me personnaliser mes suivis de glycémie (plus avantageusement que le logiciel fourni par le fabriquant du lecteur).

    J'utilise le lecteur de glycémie One Touch Ultra et la communication s'effectue grâce à un cable qui relie le lecteur au PC via le port série (RS 232).

    J'ai trouvé sur le site de LifeScan (le fabriquant), les spécifications techniques sur la communication avec le lecteur que je résume ci-dessous : «

    Cable: Connect LifeScan Interface cable to an available serial/com port on the computer. Insert the LifeScan Interface cable plug into the ONE TOUCH® Ultra data port that is located at the bottom of the meter.

    Software: Select port settings in communications software:
    Baud Rate = 9600 bps Data Bits = 8
    Stop Bits = 1 Parity = none
    Flow Control = None Com Port = port # utilized

    Set the Caps lock to "ON" on your keyboard and type a "DM?" command to wake up the Meter. The Meter should display "PC". The Meter is now ready to communicate with your computer. You may now issue the following commands to upload and erase the results stored in the Meter's memory.

    · DM? : send the Meter's software version and date
    · DM@ : send the Meter's serial number
    · DMF : send date and time from the Meter's clock
    · DMP : upload blood and control records from the Meter's memory
    · DMSU'x' : set or display the glucose Units
    · DMST'x' : set or display the Time format (AM/PM or 24hr)
    · DMTmm/dd/yy hh:mm[:ss] : set the date and Time of the Meter's clock
    · DMZ : zero the Meter's data log

    Serial commands and responses are encoded as ASCII characters. A checksum is generated for all messages and the hexadecimal representation of the least significant 16 bits of the checksum (a blank followed by 4 characters) is placed at the end of each response message, just before the carriage return (<CR>), line feed (<LF>) pair.

    The following conditions must be met to enable the LifeScan Interface
    Cable to work with the ONE TOUCH® Ultra Meter:
    1. The computer must assert (apply a positive RS-232 voltage to) RTS
    and/or DTR. Either or both of these signals supply power to the cable circuitry.
    2. The computer may leave RTS "open" but may not drive it to a negative
    RS-232 level.
    3. The computer communications port must be set to 9600 baud, 8 data
    bits, no parity, and one stop bit. »

    J'ai écrit le code JAVA suivant pour essayer de réveiller le lecteur
    : «

    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
    public void init() {
          Win32Driver w32Driver = new Win32Driver();
          SerialPort portSerie = null;
     
          // initialisation du port
          w32Driver.initialize();
          portInitialise = true;
     
          // ouverture du port "COM1"
          portId = CommPortIdentifier.getPortIdentifier("COM1");
          portSerie = (SerialPort)portId.open("GlucoMeter", 2000);
     
          // paramétrage du port
          portSerie.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
     
          portSerie.setRTS(true);
          portSerie.setDTR(true);
     
          portSerie.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
     
          // récupération du flux de lecture
          BufferedReader fluxLecture = new BufferedReader( new
    InputStreamReader(portSerie.getInputStream()) );
     
          // ajout d'un flux d'écriture
          OutputStream fluxEcriture = portSerie.getOutputStream();
     
          // ajout du listener
          portSerie.addEventListener(this);
     
          // === TENTATIVE DE COMMUNICATION AVEC LE LECTEUR ===
          char debut = 17;
          oneTouch.sendMessage(debut + "\rDMS\r\r");
     
          try {
                Thread.sleep(1700);
          } catch (InterruptedException e1) {
                e1.printStackTrace();
          }
     
          oneTouch.sendMessage(debut + "\rDMS\r\r");
     
          try {
                Thread.sleep(1700);
          } catch (InterruptedException e1) {
                e1.printStackTrace();
          }
     
          oneTouch.sendMessage(debut + "\rDM?");
     
          ...ETC...
     
    }
     
    public void serialEvent(SerialPortEvent event) {
            System.out.println("Je reçois un début de signal...");
     
            // gestion des événements sur le port :
            // on ne fait rien sauf quand les données sont disponibles
            switch (event.getEventType()) {
                    case SerialPortEvent.BI : System.out.println("message lu BI ==
    BREAK"); break;
                    case SerialPortEvent.OE : System.out.println("message lu OE"); break;
                    case SerialPortEvent.FE : System.out.println("message lu FE"); break;
                    case SerialPortEvent.PE : System.out.println("message lu PE"); break;
                    case SerialPortEvent.CD : System.out.println("message lu CD"); break;
                    case SerialPortEvent.CTS : System.out.println("message lu CTS");
    break;
                    case SerialPortEvent.DSR : System.out.println("message lu DSR");
    break;
                    case SerialPortEvent.RI : System.out.println("message lu RI"); break;
                    case SerialPortEvent.OUTPUT_BUFFER_EMPTY :
    System.out.println("message lu VIDE");
                    break;
                    case SerialPortEvent.DATA_AVAILABLE :
                            System.out.println("Message disponible : ");
     
                            try {
                                    maChaine = new String(fluxLecture.readLine());
                                    System.out.println("chaine reçu : " + maChaine);
     
                            } catch (Exception e) {
                                    System.out.println("impossible de lire la ligne...");
                                    e.printStackTrace();
                            }
                            break;
                    }
            }
     
    }
     
    public void sendMessage(String s) {
            try {
                    fluxEcriture.write(s.getBytes());
                    System.out.println("Message suivant envoyé : " + s);
            } catch (IOException e) {
                    System.out.println("Erreur lors de l'envoi du message : " +
    e.getMessage());
            }
     
    }
    Lorsque j'exécute le code ci-dessus, il ne se passe rien ; mon lecteur refuse de se réveiller et d'afficher "PC" pour commencer la communication. Je me suis alors décidé à utiliser les logiciels Serial Sniffer AX DEMO 2.0, HHD Serial Monitor, Serial Monitor Professionnal pour espionner le logiciel fourni par LifeScan qui fonctionne bien avec mon cable.

    Je me suis ainsi aperçu :
    - la commande pour réveiller le lecteur n'est pas "DM?" comme écrit
    dans la specification mais "DMS"
    - les commandes sont précédés du caractère numéro : 17

    Mais en envoyant exactement les mêmes données au lecteur de glycémie
    que le logiciel fourni par Lifescan, mon lecteur refuse de s'allumer.

    Il doit y avoir un problème sur le mode de communication ? Y-aurait-il une erreur sur la spécification au niveau de la vitesse, du controle de flux de données, du nombre de bits d'arret ..etc ?

    Auriez-vous une idée et comment pourrais-je détecter d'où viens le
    problème ?

    De plus, le logiciel Serial Monitor Professionnal m'a donné une information supplémentaire :
    - avec le logiciel de LifeScan, durant la communication, on a :
    * RTS et DTR qui sont verts, c'est à dire au niveau haut du signal ;
    * CTS, DSR, DCD, RI sont gris, indiquant un état de la ligne non déterminé pour le moment.

    - avec ma classe JAVA (cf. ci-dessus), on a durant la communication :
    * RTS et DTR qui sont verts, c'est à dire au niveau haut du signal ;
    * CTS, DSR, DCD, RI sont ROUGES, indiquant un niveau bas du signal.

    Comment dois-je faire pour que ces capteurs soient considérés comme "non déterminé pour le moment" ???

    Merci beaucoup pour votre aide.
    Mille bisous à tous.

    Céline DUPONT.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Par défaut
    Je crois deviner une source d'erreur, peut-être y en a-t-il d'autres. En Java, les caractères sont codés en UTF-16, c'est-à-dire sur 16 bits tandis que le format d'encodage attendu semble être de 8 bits (Data Bits = 8). Je ne sais plus comment, mais il est possible d'obtenir une chaîne dans un format différent de l'UTF-16. J'espère que d'autres personnes pourront te fournir des informations plus précises

  3. #3
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Idem, et si tu veux mon avis le DM@ est aussi erroné, il y a du avoir un problème d'encodage à la base déjà sur le site ou tu as récupéré ces données donc c'est fort probable que le problème vienne de là

    P.S: Enfin une personne qui structure bien son premier post sur le forum, polie et tout

    Bienvenue à toi et pour ton premier post
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 3
    Par défaut
    Bonjour,

    merci pour vos réponses...

    Les données doivent être envoyés en 8 bits donc j'ai mis le paramètre : SerialPort.DATABITS_8 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "portSerie.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);"
    N'est-ce pas suffisant ?

    Concernant les données à envoyer : DMS, DM?, DM@ je les ai trouvé sur le powerpoint officiel de lifescan (cf. pièce jointe).

    L'histoire de l'UTF-8 ou UTF-16 interviendrait lors de la lecture des données ou lors de l'envoi ?

    De plus,votre solution n'explique pas pourquoi le logiciel Serial Monitor Professionnal m'a donné cette information :
    - avec le logiciel de LifeScan, durant la communication, on a :
    * RTS et DTR qui sont verts, c'est à dire au niveau haut du signal ;
    * CTS, DSR, DCD, RI sont gris, indiquant un état de la ligne non déterminé pour le moment.

    - avec ma classe JAVA (cf. ci-dessus), on a durant la communication :
    * RTS et DTR qui sont verts, c'est à dire au niveau haut du signal ;
    * CTS, DSR, DCD, RI sont ROUGES, indiquant un niveau bas du signal.

    Comment dois-je faire pour que ces capteurs soient considérés comme "non déterminé pour le moment" ???

    Merci à tous pour vos réponses.
    Gros bisous.
    Céline DUPONT.
    Images attachées Images attachées

  5. #5
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour,

    As-tu essayé d'effectuer des test avec HyperTerminal et de "monitorer" la liaison sérielle?

    les signaux RD, DSR, CTS, DCD et RI sont générés pas le DCE (Data Communication Equipment) soit ton appareil.

    Question naïve: Utilises-tu le même câble pour tes test en JAVA?

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 3
    Par défaut
    Bonjour,

    j'ai essayé d'utiliser HyperTerminal et miraculeusement, la communication avec le lecteur de glycémie a fonctionné.
    Le port était configuré de la manière suivante :
    * port : COM1
    * vitesse : 9600 bauds
    * bits : 8 bits
    * bit d'arret : 1
    * controle du flux : aucun.

    J'ai pu envoyé les commandes : DMS, DM?, DM@, etc... et j'ai vu s'afficher les réponses du lecteurs.

    Je ne dispose que d'un seul câble donc je pense que mon problème vient de mon code Java.

    Auriez-vous une idée puisque la communication fonctionne avec HyperTerminal ???

    Mille bisous à tous.
    Céline.

Discussions similaires

  1. [Série] Accès au port série sous linux
    Par ghost dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 10/10/2007, 10h43
  2. 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
  3. probleme de communication port série
    Par ben23 dans le forum MFC
    Réponses: 8
    Dernier message: 06/02/2004, 15h12
  4. Recherche de l'adresse du port série
    Par StephCal dans le forum Langage
    Réponses: 8
    Dernier message: 07/01/2004, 11h23
  5. Problème avec le port série sous Windows XP
    Par didou2dek dans le forum Composants VCL
    Réponses: 6
    Dernier message: 02/09/2003, 19h50

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