Lecteur de glycémie & port Série...

Résolu
Celine788 Messages postés 5 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 28 juin 2006 - 26 juin 2006 à 21:15
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 - 28 juin 2006 à 23:16
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 : «

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.

9 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
27 juin 2006 à 09:49
Salut,


Simple question et avec un hyper terminal tu y arrive au moins???? je
pose cette question pasque avant d'investiguer il serait plus judicieux
de savoir si le problème viens vraiment de ton code...un truc que tu
fais ou que tu ne fais pas... (sinon apriori le code semble être bon).

------------------------------------
On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ...

WORA
3
cs_Foub Messages postés 12 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 16 juillet 2007
27 juin 2006 à 14:13
effectivement, je n'ai pas vérifié abec HyperTerminal...
Je ne connais pas : cela doit être un outil pour dialoguer avec le port série, non ?
0
Celine788 Messages postés 5 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 28 juin 2006
27 juin 2006 à 14:17
Foub, qu'as-tu voulu dire ?
Oui, je crois qu'HyperTerminal permet de dialoguer avec le port série.
Je vais essayer de chercher de ce côté-là...
Merci pour vos réponses !
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
27 juin 2006 à 14:40
Salut,


l'hyperterminal(windows) ou minicom (linux) sont des applications qui permettent d'effectuer des connexions rs232.

Si cela ne fonctionne pas avec un hyperterm. c'est que le problème ne vient pas de ton code java.

Donc solutions possible :

    - verification de ton lien serie (etat, activation, ...)

    - verification du cable

    - verification du lien serie sur le "One Touch Ultra"

    - installer linux et virer cet os défaillant qu'est windows (j'assume mes trolls ).


voici une exemple en anglais pour la config d'hyperterm

http://www.modemsite.com/56k/x2-hyperterm.asp


perso je fais toujours un test avec minicom avant de faire le test avec
un de mes codes afin de ne pas perdre mon temps a me dire  "ca
vient de mon code ou pas?".

------------------------------------
On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ...

WORA
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Celine788 Messages postés 5 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 28 juin 2006
27 juin 2006 à 14:47
Le logiciel fourni par One Touch Ultra fonctionne parfaitement donc on peut penser que cela vient de la configuration de la connexion au port série.
Comment puis-je détecter l'état, l'activation au niveau du port série utilisée par l'application On Touch Ultra ?

Mille bisous à tous.
Céline DUPONT.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
27 juin 2006 à 15:59
Mais il fonctionne bien avec un hyperterm? ou il fonctionne simple bien?


tu veux tester l'état comment? tu utilise qu'elle api pour la com.
rs232 c'elle de sun (qui merdouille à mort avec xp (sauf si ils ont
corrigé depuis (5mois mes derniers test avec)) ou tu utilise une api
proprio et dans ce cas merci de donner un lien du site pour regarder ce
que c'est (sinon pour win xp j'utilise serialio qui est payante mais m'a permit de piloter à 100% un routeur cisco via une appli java).

------------------------------------
On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ...

WORA
0
Celine788 Messages postés 5 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 28 juin 2006
28 juin 2006 à 20:54
Bonjour messieurs,

j'ai effectivement essayé de communiquer avec le lecteur de glycémie avec HyperTerminal de windows XP et çà a marché !!!!!!!!!!

J'ai défini les paramètres suivant :
    * Port : COM1
    * Bits par seconde : 9600
    * Bits de données : 8
    * Parité : Aucune
    * Bits d'arret : 1
    * Controle de flux : Aucun

J'ai ensuite pu envoyer les commandes suivantes : DMS, DM?, DM@...etc et le lecteur me répondait bien...

C'est donc mon code Java qui ne fonctionne pas.
Auriez-vous une idée ?
Aidez-moi.... merci !!!

Gros bisous à tous.
Céline.
0
Celine788 Messages postés 5 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 28 juin 2006
28 juin 2006 à 20:56
Re,

j'ai utilisé l'API suivante pour piloter le port série : http://christophej.developpez.com/tutoriel/java/javacomm/

Existe-t-il d'autres librairies pour piloter le port série en Java ?

Merci beaucoup.
Céline.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
28 juin 2006 à 23:16
essaye avec serialio et aussi de voir si tu peux te procurer une version de demo afin de faire un essai

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
0
Rejoignez-nous