aujourd'hui je souhaite lire les données téléinfo de mon compteur EDF.
Pour cela, j'ai mon Arduino branché en usb à mon pc sous vista, et réalisé le circuit téléinfo suivant :
Mon code de test est le suivant :
#include <SoftwareSerial.h>
//réception sur la pin 2
SoftwareSerial cptSerial(2, 3);
void setup() {
Serial.begin(1200); // opens serial port, sets data rate to 1200 bps
cptSerial.begin(1200);
}
void loop() {
if (cptSerial.available())
Serial.write(cptSerial.read() & 0x7F);
}
parce que la trame téléinfo (en france, ailleurs,je sais pas) est transmise selon le format 1200 bits/s, 7 bits/caractères, parité paire, 1 bit de stop.
taddot:
parce que la trame téléinfo (en france, ailleurs,je sais pas) est transmise selon le format 1200 bits/s, 7 bits/caractères, parité paire, 1 bit de stop.
Attention il faut bien différencier le port série software du port série hardware !
Le port série hardware tourne avec les caractéristiques données plus haut, le port série software tourne suivant comment tu le configure.
Il me semble qu'il n'est pas possible de faire du 7 bit + parité avec SoftSerial tu va devoir utiliser le port série hardware et manipuler les registres de l'ATMega pour le configurer correctement.
1.Pourquoi presque "inverser" la partie côté arduino a changé l'info ?
Pour les 7 bits, oui je parviens du coup à les lire avec Putty.
2.Si j'essaie de comprendre ce que tu expliques, barbudor, il serait possible de communiquer et donc lire les infos envoyées par l'arduino en 8 bits comme "habituellement" ?
Ou alors je capte pas ?
3.Arf, mon compteur n'est pas en mode téléinfo, je n'ai que le numéro de compteur... Va falloir payer EDF pour qu'un gars se déplace...
edoc:
2.Si j'essaie de comprendre ce que tu expliques, barbudor, il serait possible de communiquer et donc lire les infos envoyées par l'arduino en 8 bits comme "habituellement" ?
Ou alors je capte pas ?
Une transmission série 7-bit + parité est en fait une transmission -bit avec :
7 bit utiles dans les poids faibles (bit 0 à bit 6)
1 bit de parité c'est à dire un bit qui permet de vérifier la validité de l'octet pour se prémunir d'erreurs de transmission.
Le bit de parité est calculé de telle façon que :
Parité Paire : la somme de tous les bits de l'octet y compris la parité est un nombre pair
parité Impaire : la somme de tous les bits de l'octet y compris la parité est un nombre pair
Normalement, quand tu utilise une fonction série matérielle telle que le Serial de l'Arduino, c'est le composant qui gère cela.
Il va recevoir les 8 bits, vérifier la parité. Si la vérification de parité est ok, il masque le 8eme bit (parité) et remonte au code (lib HardwareSerial de l'Arduino) un octet dont le 8eme bit est toujours à zéro. Si la vérification est ko, il jète l'octet.
Résultat sur un message complet dont certains caractères sont erronés, tu ne reçoit pas les caractères erronés. Ca te fait une belle jambe parce que quand il manque des caractères "on n cmprd ps tot c qu di l'are" (on ne comprend pas tout ce que dit l'autre ;))
Donc le message est pourris de toute façon....
Autant ne pas tenir compte de la parité, laisser les caractères faux arriver et utiliser autre chose pour valider le message tel qu'un checksum par exemple.
La lib SoftwareSerial elle ne fait pas cette distinction. Elle reçoit les 8 bits et retourne à l'application les 8 bits que le 8eme bit soit un bit utile ou un bit de parité.
Le problème c'est que par exemple (exemple en parité paire) si pour le caractère 'A' code ASCII 65 (0x41), tu va bien recevoir 0x41 (2 bits sont à 1, le bit 0 et le bit 6) pour le caractère 'C' code ASCII 67 tu va recevoir 0xC3. Le transmetteur aura positionné le 8eme bit a 1 de façon que le nombre de bits à 1 soit pair (bits 0, 1, 6 et 7).
Il suffit donc de masquer chaque octet reçu par un "& 0x7F" (c'est la même chose que "& ~_BV(7)" et voilou.