Emission-Réception HC-12 et encodage caractères

Bonjour,
Poursuivant mon aventure d'essais avec les HC-12, j'ai réussi à faire communiquer deux HC-12 avec le même programme : l'un en "émetteur", l'autre en "récepteur". J'utilise VSCode.

Voici le code programme :

#include <Arduino.h>
#include <SoftwareSerial.h>
//#include <AltSoftSerial.h>

String msg;
String RxChar;

#define rxPin 4
#define txPin 5
#define setPin 12
SoftwareSerial HC12(rxPin , txPin);
//AltSoftSerial HC12(rxPin , txPin);

void setup() 
{
 Serial.begin(9600);
 HC12.begin(9600);
 pinMode(setPin,OUTPUT);
 // passage en mode transparent
 digitalWrite(setPin,HIGH);
 delay(100);
}

void loop() 
{
 if(Serial.available())
 {
   msg = Serial.readString();
   Serial.print(F("SND : "));
   Serial.println(msg);
   HC12.print(msg);
 }
 if(HC12.available())
 {
   RxChar = HC12.read();
   Serial.print(F("RCV : "));
   Serial.println(RxChar);
   //HC12.print(RxChar);
 }
}

Le problème est le suivant : lorsque j'envoie de l'émetteur vers le récepteur, ce dernier reçoit les caractères encodés en binaire alors qu'en sens inverse, l'émetteur reçoit bien en alpha numérique. Je précise que l'émetteur est un Arduino ESP8285 déclaré en ESP8266 et le récepteur est un Arduino UNO.

Quelqu'un pourrait-il me dire s'il faut préciser le mode d'affichage dans le code ? et comment ? En émission, le moniteur série affiche
"---- Message encodé en utf8 envoyé : "Bonjour Bébert !" ----"

Merci pour vos réponses.
Bonne soirée
Bébert

Ne postez pas d’image d’un texte svp…

Quand vous postez le code, faites le en entier

Quel est le type de RxChar?

D’autre part en UTF8 le glyphes (caractères) peuvent être représentés sur 1 à 4 octets, donc si vous imprimez octet par octet avec print ne va pas fonctionner
Il faut utiliser write pour envoyer le flux à la console

Bonjour J-M-L,

Merci pour cette réponse.
Les deux HC12 ont le même code programme.
RxChar est déclaré en type "String".


#include <Arduino.h>
#include <SoftwareSerial.h>
//#include <AltSoftSerial.h>

String msg;
String RxChar;

#define rxPin 4
#define txPin 5
#define setPin 12
SoftwareSerial HC12(rxPin , txPin);
//AltSoftSerial HC12(rxPin , txPin);

void setup() 
{
 Serial.begin(9600);
 HC12.begin(9600);
 pinMode(setPin,OUTPUT);
 // passage en mode transparent
 digitalWrite(setPin,HIGH);
 delay(100);
}

void loop() 
{
 if(Serial.available())
 {
   msg = Serial.readString();
   Serial.print(F("SND : "));
   Serial.println(msg);
   HC12.print(msg);
 }
 if(HC12.available())
 {
   RxChar = HC12.read();
   Serial.print(F("RCV : "));
   Serial.println(RxChar);
   //HC12.print(RxChar);
 }
}

J'avais inséré les deux images pour montrer seulement les deux cas de figure avec des codages différents des caractères reçus suivant que l'émission vient de HC12 "Emetteur" ou du HC12 "Récepteur".

  • Lorsque le HC12 'Emetteur" envoie :
    Moniteur Série - Côté Emetteur :
    ---- Message encodé en utf8 envoyé : "Bonjour 123456\r\n" ----
    SND : Bonjour 12345�C��

Moniteur Série - Côté Récepteur :
RCV : 66
RCV : 111
RCV : 110
RCV : 106
RCV : 111
RCV : 117
RCV : 114
RCV : 32
RCV : 49
RCV : 50
RCV : 51
RCV : 52
RCV : 53
RCV : 54
RCV : 13
RCV : 10

  • A l'inverse, lorsque le HC12 "Récepteur" envoie :
    Moniteur Série - Côté Récepteur :
    ---- Message encodé en utf8 envoyé : "Bonjour 12345" ----
    SND : Bonjour 12345

Moniteur Série - Côté Emetteur :
RCV : B
RCV : o
RCV : n
RCV : j
RCV : o
RCV : u
RCV : r
***RCV : ***
RCV : 1
RCV : 2
RCV : 3
RCV : 4
RCV : 5

J'ai repris mes docs Arduino sur les chaînes de caractères. Je devrais pouvoir m'en débrouiller. Je vais utiliser déjà le "write" au lieu du "print".
Merci beaucoup.
A1 bientôt.
Bébert

essayez un simple code comme celui ci:

#include <Arduino.h>
#include <SoftwareSerial.h>
const byte rxPin  =  4;
const byte txPin  =  5;
const byte setPin = 12;

SoftwareSerial HC12(rxPin , txPin);

void setup() {
  pinMode(setPin, OUTPUT);
  digitalWrite(setPin, HIGH);  // passage en mode transparent
  Serial.begin(9600);
  HC12.begin(9600);
}

void loop() {
  if (Serial.available()) HC12.write(Serial.read());
  if (HC12.available())   Serial.write(HC12.read());
}

dans votre code vous lisez une String en entier lors de l'acquisition, ce qui fait que dans le buffer vous avez tous les codes, éventuellement en représentation étendue en UTF8 (les codes ASCII de base sont sur un seul octet mais si vous commencez à rajouter des €¥çûö ou d'autres langues comme 你好 etc alors vous aurez des caractères sur plusieurs octets). A la réception comme vous ne lisez pas tout le message mais imprimez au fil de l'eau chaque octet séparément, vous ne laissez pas une chance au logiciel qui fait le terminal série de comprendre l'UTF8 et de remettre ensemble les octets qui font partie du même "caractère" graphique.

Bonjour J-M-L,

Fichtre !!!... Voilà un code mini, mini, et bigrement efficace ! Grand merci à vous !

Mon code me faisait tourner en rond à cause de mon manque de connaissances concernant les types de variables à utiliser, leur mode de codage, de transmission. J’en connais les principes essentiels mais pas assez en profondeur. Je cherche toujours à comprendre et à faire miennes toutes les nouveautés que je découvre au hasard de mes recherches et explorations.

En ce qui concerne le HC-12, je n’ai pas trouvé de détails sur son mode de communication UART (à part « 8 date bits-no parity – 1 stop bit ») dans les datasheets. J’étudierai cela à l’oscilloscope.

Encore merci pour votre aide qui fait gagner énormément de temps.

Prochaine étape avec les HC-12 : envoi de données numériques. J’aborde ces questions de communication HF pour un anémomètre que mon fils voudrait utiliser à distance.

Bien à vous.
Bébert

vous pouvez transmettre en binaire (plus compact et rapide) ou sous format textuel ce qui nécessitera dans ce cas d'analyser le texte pour extraire l'information côté réception

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.