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
: «
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.
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()); } }
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.
Partager