30 Dec 2009 à 12:38 par isontheline
Cette page présente le protocole utilisé par les stations météorologiques WS2300 de Lacrosse Technology.
Protocole
RS-232
Les stations météorologiques du type WS2300 communiquent via le port RS-232 :- Vitesse de transmission : 2400 bits/s
- Taille des données : 8 bits
- Parité : Aucune
- Bits de stop : 1 bit
- Broche RTS : état haut
- Broche DTR : état bas
Les broches RTS et DTR sont utilisées pour communiquer avec la station.
Résumé général du protocole
- Initialisation de la communication
- Envoi de l'adresse
- Envoi de la commande (lecture ou écriture)
- Lecture de la réponse (si commande de lecture envoyée)
Résumé des commandes
Les échanges avec la station via le port RS-232 s'effectue sous forme d'octets. Cependant l'adressage s'effectue quant à lui par quartet (demi octet ou encore nibble).Initialisation
Important :
Avant d'envoyer toute commande ou bien lorsqu'une erreur de communication s'est produite, il faut effectuer une initialisation.L'initialisation consiste à envoyer l'octet 0x06 à la station. Tant que la station né répond pas 0x02, continuer de renvoyer 0x06.
Une temporisation de plus ou moins 100 ms entre chaque tentative est conseillée.
Envoi de l'adresse
Les stations météorologiques du type WS2300 possèdent un bus mémoire de largeur 2 octets. A la place d'implémenter un protocole plus ou moins complexe, la récupération d'informations depuis les stations WS2300 s'effectue en envoyant directement l'adresse où l'on souhaite effectuer une opération de lecture ou d'écriture.Sachant que l'adressage s'effectue par quartet (nibble), il faut donc envoyer 4 octets à la station tout en lui indiquant que nous sommes en mode adressage. Voici la commande générale pour envoyer un quartet d'adressage :
0x82 + (nibble * 4)
| |
| |-> Quartet de l'adresse à envoyer
|-> Nous indiquons à la station que nous sommes en mode adressage
| |
| |-> Quartet de l'adresse à envoyer
|-> Nous indiquons à la station que nous sommes en mode adressage
Prenons un exemple, nous souhaitons envoyer l'adresse 0x0373 (température extérieure) :
- Envoyer 0x82 + (0 * 4)
- Envoyer 0x82 + (3 * 4)
- Envoyer 0x82 + (7 * 4)
- Envoyer 0x82 + (3 * 4)
A chaque octet d'adressage envoyé, la station répond par un accusé. Notre exemple précédent aurais retourné les accusés suivants :
Accusé octet 1 : 0x00
Accusé octet 2 : 0x13
Accusé octet 3 : 0x27
Accusé octet 4 : 0x33
Accusé octet 2 : 0x13
Accusé octet 3 : 0x27
Accusé octet 4 : 0x33
Les octets d'accusation sont donc de la forme :
octet_accusé = rang * 0x10 + nibble
Important :
Si vous constatez que l'accusé est erroné, vous devez immédiatement effectuer une initialisation. En effet cela indique une mauvaise adresse et pourrait être dommageable pour la station.Commande de lecture
Toujours suite à notre exemple, nous souhaitons lire 2 octets depuis la station à l'adresse 0x0373 (température extérieure).Pour se faire nous devons envoyer la commande de lecture générale suivante :
0xC2 + (nb_octets * 4)
| |
| |-> Nombre d'octets à lire depuis la précédente adresse envoyée. Nb octets <= 15 (0x0F)
|-> Nous indiquons à la station que nous sommes en mode lecture
| |
| |-> Nombre d'octets à lire depuis la précédente adresse envoyée. Nb octets <= 15 (0x0F)
|-> Nous indiquons à la station que nous sommes en mode lecture
Dans notre exemple, cela donne :
0xC2 + (2 * 4)
A cette commande de lecture, la station répond :
0x3n
|
|-> Nombre d'octets demandés
|
|-> Nombre d'octets demandés
Dans notre cas, la station répond :
0x32
Si la réponse attendue n'est pas celle renvoyée par la station, recommencé immédiatement les étapes suivantes :
- Initialisation
- Envoi de l'adresse
- Envoi de la commande de lecture
Si la réponse de la station est correcte, nous pouvons lire à présent les octets demandés. Les octets sont immédiatement envoyés après la réponse de la station. Ils sont suivis par un seul octet de checksum (vérification).
Dans notre exemple la station pourrait répondre :
0x50 0x52 0xA2
| | |
| | |-> Octet de checksum : 0x50 + 0x52 = 0xA2
| |-> Second octet de la température extérieure
|-> Premier octet de la température extérieure
| | |
| | |-> Octet de checksum : 0x50 + 0x52 = 0xA2
| |-> Second octet de la température extérieure
|-> Premier octet de la température extérieure
Si le checksum est incorrect, recommencer les étapes suivantes :
- Initialisation
- Envoi de l'adresse
- Envoi de la commande de lecture
- Lecture des données
Si le checksum est correct, peut alors commencer le décodage des données. Le décodage des données peut se trouver ici : WS2300 Data