Liaison serial entre deux arduino plusieurs nombres

Bonjour
je cherche a envoyer plusieurs valeurs entre une mega pro mini et une ESP32 en liaison série.
pour une valeur pas de problème, mais plusieurs, je ne sais pas comment séparer les valeurs sur la slave.

Serial.println(valeur01);
Serial.println(valeur02);
etc..
sur la mega en maitre

int valeur01= Serial.read();
Serial.print(valeur01);
comment récupérer la (valeur02) ?
je pense qu'il faut un séparateur de genre ("/n"), mais j'ai pas tout compris
merci

Bonjour imaljl1

Le mieux est de mettre tes variables dans une structure, de les envoyer avec par exemple:
Serial1.write((byte )&donneesAtransmettre, sizeof donneesAtransmettre);
et de les recevoir avec:
Serial1.readBytes((byte)&donneesAtransmettre, sizeof donneesAtransmettre);

Je te mets un exemple d'émission:

struct donneesMesureesDef
{float voltageA; int16_t intValueA; float voltageB; uint8_t byteA; float voltageC;}__attribute__((packed));;
donneesMesureesDef donneesAtransmettre;

unsigned long loopTime = 500;     // Toutes lkes 500 milliSecondes
unsigned long loopTimeR = millis();

void setup()
{
	Serial.begin(115200);
	Serial1.begin(115200);
	
	donneesAtransmettre.voltageA = 12.55;
	donneesAtransmettre.voltageB = 2.03;
	donneesAtransmettre.voltageC = 3750.20;
}

void loop()
{
	if (millis()-loopTimeR >= loopTime)
	{
		Serial1.write((byte *)&donneesAtransmettre, sizeof donneesAtransmettre);
		
		donneesAtransmettre.voltageA += 0.25;     // Pour faire "bouger" les valeurs
		donneesAtransmettre.voltageB += 1.1;
		donneesAtransmettre.voltageC += 110.02;
		donneesAtransmettre.intValueA ++;
		donneesAtransmettre.byteA ++;
		
		loopTimeR = millis();
	}
}

et de réception:

struct donneesMesureesDef
{float voltageA; int16_t intValueA; float voltageB; uint8_t byteA; float voltageC;}__attribute__((packed));;
donneesMesureesDef donneesAtransmettre;

bool nouvellesDonnes = false;

void setup()
{
	Serial.begin(115200);
	Serial2.begin(115200);
}

void loop()
{
	if (Serial2.available())
	{
		Serial2.readBytes((byte*)&donneesAtransmettre, sizeof donneesAtransmettre);
		nouvellesDonnes = true;
	}
	
	if (nouvellesDonnes)
	{
		Serial.print(donneesAtransmettre.voltageA); Serial.print("\t");
		Serial.print(donneesAtransmettre.voltageB); Serial.print("\t");
		Serial.print(donneesAtransmettre.voltageC); Serial.print("\t");
		Serial.print(donneesAtransmettre.intValueA); Serial.print("\t");
		Serial.print(donneesAtransmettre.byteA); Serial.print("\t");
		Serial.println("");
		
		nouvellesDonnes = false;
	}
}

Dans cet exemple, l'émetteur envoie, au récepteur, ses données 2 fois par seconde.

L'avantage de la structure est que tu peux toujours ajouter ou supprimer des variables, aux 2 bouts, sans modifier les fonctions d'émission/réception.

Cordialement
jpbbricole

Quand on fait de la transmission en binaire sur voie série il est important de prévoir un moyen de synchro (par exemple si on prend la première communication en cours de route ou si un octet venait à être perdu) donc prévoir dans le protocole un en tête particulier par exemple

Attention aussi aux deux architectures différentes (avr et esp). Il n’y a pas de garantie de compatibilité des tailles de type (un float ça va aller un peu par chance mais vous auriez un souci avec un int ou un double. Par exemple Un int serait sur 16 bits d’un côté et 32 bits de l’autre). L’usage des types à taille fixe comme int16_t etc est à recommander.

Enfin il faut aussi faire attention à la la façon dont le compilateur va organiser les octets dans la structure. Ici on sera en little endian des deux côtés donc ça va mais il serait bon d’utiliser l’attribut ((packed)) sur la structure pour optimiser le nombre d’octets à transmettre et s’assurer de leur ordre.

Bonsoir imaljl1

Sur les conseils de @J-M-L, j'ai optimisé la structure des données pour permettre la transmission entre un Arduino et un ESP32 post #2.
Côté Arduino, c'est un Mega avec Serial1 et côté ESP32 c'est Serial2 Tx 17 et Rx 16.

Cordialement
jpbbricole

Ca ne fonctionne pas.
j'ai pris soin de rajouter la modif pour ESP32 DevKit V1:
#define RXD2 16
#define TXD2 17
Serial1.begin(9600, SERIAL_8N1, RXD2, TXD2);

avec ce code ça marche mais je ne sait pas comment récupérer plusieurs valeurs.


// master//
void setup() {
  Serial.begin(115200);
}
void loop() {  
for ( int i = 0; i < 360; i++){ 
  Serial.println(i);  
  delay(100);
}
}
// slave //
#define RXD2 16
void setup()
{
  Serial.begin(115200);
  Serial1.begin(115200, SERIAL_8N1, RXD2);
}

void loop()
{
   if(Serial1.available()){
    Serial.print(char(Serial1.read()));
   } 
}

votre Arduino est en 5V et l'ESP en 3.3V. avez vous mis une adaptation de tension ?

Bonsoir imaljl1

Les pin 16 et 17 c'est Serial2.

As-tu essayé la paire d'exemples du post #2? Avec cette méthode tu peux aisément passer plusieurs variables.

Cordialement
jpbbricole

oui j'ai testé, mais sans succès pour le moment;

Bonsoir imaljl1

Tu as bien câblé Mega Tx 18 sur ESP32 16 Rx et Mega 19 Rx sur ESP32 17 Tx ?

Cordialement
jpbbricole

ouf c'est bon pour la paire d'exemples du [post #2.
selection de la mauvaise carte dans l'ide.
reste a l'intégrer dans mon code pour la détection de module FrSky
un grand merci " jpbbricole " c'est trop cool. super réactif :grinning:
ps: c'est pas encore gagné, mais je vais pouvoir avancer.

Super!
L'important est que la définition de la structure

struct donneesMesureesDef
{float voltageA; int16_t intValueA; float voltageB; uint8_t byteA; float voltageC;}__attribute__((packed));;

soit identique dans les 2 sketchs.

Si tu vux un coups de main.... :wink:
Mets ton code actuel en ligne.

Cordialement
jpbbricole

Bonjour

Avez vous pris soin de l’adaptation de tension ?

Bonjour J-M-L

Il y a une polémique sur ce sujet à propos de est-ce que l'EPS32 est tolérant au 5V sur les pin E/S.
Paraîtrai que le PDG d'Espressif l'aurai dit?
Dans ce montage de liaison entre le Mega et l'ESP32, la liaison est directe et tout fonctionne.
Bien sûre il ne faut alimenter l'ESP32 qu'en 3.3V, sauf par l'USB qui est en 5V.

Cordialement
jpbbricole

https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf
5.3 DC Characteristics (3.3 V, 25 °C)
VIH High-level input voltage 0.75×VDD1 VDD1+0.3 V
VIL Low-level input voltage –0.3 - 0.25×VDD1 V

+1
Transmettre des données en binaire est assez complexe si l'on a besoin de fiabilité :

  • octet de début de trame
  • octet de fin de trame
  • mode transparent (DLE)
  • CRC

Mais tout dépend de l'importance des données à transmettre.

Oui - la spec dit que non, la pratique montre que ça résiste. La question c’est pendant combien de temps.

Par prudence si cet équipement doit rester actif de longues années il vaut mieux adapter la tension au moins dans le sens Tx MEGA ➜ Rx ESP

Et j'ajouterais que la première question à se poser dans ce genre de montage, est l'utilité du couple ARDUINO ESP32.
Souvent il est beaucoup plus intéressant et surtout plus sûr de larguer l'ARDUINO, conserver uniquement l'ESP32, quitte à ajouter un ou plusieurs expander du genre MCP23017 si l'on manque d'entrées / sorties.

ESP 32 n'est pas compatible avec la bibliothèque " FrSky S-Port Telemetry"

bonjour, je suis en face du même problème. j'ai une liaison entre un Arduino UNO et un esp12-e en liaison série. je doit transmettre 6 valeur différente entre l'esp et le UNO. 3 valeur bool et 3 valeur uint8_t.
j'ai essayé ta méthode avec les byte. j'arrive effectivement a faire la communication entre les deux carte grâce au soft sériel. par contre les valeur que je reçois sur la UNO de l'esp sont totalement erroné et aléatoire. comment je pourrait rendre cette communication opérationnel ?. si tu a besoin des deux code je peut te les envoyer sans problème

Bonsoir praken1

As-tu tenu compte des remarques de @J-M-L et appliquées dans l'exemple avec attribute((packed));

Autrement attend le "passage" de @J-M-L :wink:

Cordialement
jpbbricole

Bonsoir praken1

J'ai fait l'essai entre un ESP32 Serial2, le master et un UNO, le slave, je n'ai pas d'esp12-e.
Dans le UNO avec SoftwareSerial à 9600 (Rx 3, Tx 4), à 115200, j'avais parfois des erreurs et tout se déroule sans problème.

Je te mets les 2 programmes de l'essai.
ARDFR_StructureSerialMasterEsp.ino (1.1 KB)
ARDFR_StructureSerialSlaveUno.ino.ino (973 Bytes)

Cordialement
jpbbricole