Téléinfo : probleme caracteres affiches

Bonjour,

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);
}

code testé par un utilisateur ici : Arduino UNO - Téléinfo et optocoupleur SFH620A - #3 by system - Français - Arduino Forum

Le problème est que sur Putty, data 7bits, 1 bit stop, parité Paire, je reçois en boucle des informations mais illisibles :

qVldVRbrRrvryR'=_W
qVldVRbrRrvry"'=_W
qVldVR2rRrvryR#=_W
yvryR#=_W
qVldVRbrRrvryR#=_W
qVldVR2rRrvryR#=_W
qVldVRbrRrvryR'=_W
qVldVRbrRrvry"'=_W
qVldVR2rRrvryR#=_W
yvryR#=_W
qVldVRbrRrvryR#=_W
qVldVR2rRrvryR#=_W

Alors que je devrais avoir au moins quelque chose comme:

ADCO 02092xxxxxx @

Avez-vous une idée sur l'origine de mon problème ?

Bonjour,

edoc:
Le problème est que sur Putty, data 7bits, 1 bit stop, parité Paire, je reçois en boucle des informations mais illisibles :

Pourquoi 7bits !?
La communication série PC <> arduino ce fait en 8 bits, pas de parité, 1 bit de stop, et pas de controle de flux.

salut
Essaye plutôt ça :

Et tiens nous au courant :smiley:

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.

plus d'info :

http://vesta.homelinux.free.fr/site/wiki/demodulateur_teleinformation_edf.html

Le site suivant est très instructif :

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.

Si la trame est en 7-bit + parité, ce n'est pas un problème.
Utilise SoftwareSerial en 8-bit.
Le 8eme bit (bit 7) sera le bit de parité.

Tu as le choix alors entre :

  • Laisser tomber la vérification des erreurs et masquer tous les bits 7 par quelque chose du genre
for ( i = 0 ; i < bufferLen ; i++ )
  buffer[i] &= ~_BV(7);
  • Te taper la vérification du code de parité et virer le message s'il y a eu une erreur

Hello,
Merci à tous pour vos réponses, j'ai désormais un affichage correct !

@chabot380 : merci, j'ai réalisé ton schéma, et j'obtiens bien :

ADCO 0XX8011XXXXX 8
ADCO 0XX8011XXXXX 8
ADCO 0XX8011XXXXX 8
ADCO 0XX8011XXXXX 8

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... :frowning:

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.

Est-ce clair ?

Génial, et merci pour ta réponse très précise !

En faisant le test,

Serial.write(cptSerial.read());

Sans masquer le 8eme bit, l'affichage dans le Serial Monitor n'est pas bon, c'est normal.

Serial.write(cptSerial.read() & 0x7F);

Le 8eme bit étant masqué, le caractère lu est le bon et la sortie est parfaite :slight_smile:

merci

CQFD

c'est donc réglé avec le premier schéma ou le second ?

sinon, pour exemple : Présentation de l'enregistreur serveur Web de consommation électrique

hello,

C'est bien en réalisant le 2ème schéma que cela fonctionne, comme je l'ai écrit :wink:

D'où ma question à chabot380 pour comprendre pourquoi ce 2eme schéma est bon pour moi et pas le premier.

Salut

pourquoi ? :fearful:

Le signal est modulé à 50 KHz : la présence de modulation correspondant à un 0 logique, l’absence à un 1 logique.

Donc pour avoir ça c'est le schéma que je t'ai indiqué, car le schéma que tu nous as donné faisait l'inverse !

voilà pourquoi ! :smiley:

A+