Créer une trame contenant des caractères et des données (nombres)

Bonjour,

Je souhaiterais réaliser un transfert d'information avec mon arduino nano en utilisant le port UART.

J'ai déjà réalisé une ébauche de programme. Le problème que je rencontre est le suivant, j'arrive à transmettre des données et des caractères séparément mais pas ensemble.

Mon but transmettre un STX(0x02) pour le début de trame puis un LF pour le début du bloc de donnée, une etiquette en char, puis un HT (séparateur), puis des données (en décimal), puis un HT, puis un checksum et pour finir CR fin du bloc de donnée et ETX fin de trame.

#include <SoftwareSerial.h>
#include <String.h>
String trame_complet;
const String STX1 = "2";
const String ETX1 = "3";
const String LF1 = "A";
const String HT1 = "9";
const String CR1 = "D";
const String SP1 = "20";
String etiquette = "ADCO";
int donnee = 123456;
String Som1;



void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);//,SERIAL_7E1);
}

void loop() {
    
    Som1= etiquette + HT1 + var + HT1;
   String Checksum = (Som1 & 0x3F) + 0x20;
   //(etiquette + HT*2 + donnee & 0x3F) + 0x20;
  // put your main code here, to run repeatedly:
  // trame_complet = "";
  trame_complet = STX1 + LF1 + etiquette + HT1 + var + HT1 + Checksum + CR1 + ETX1;
  Serial.print(trame_complet);
  delay(1000);
}

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Salut.
STX est égal à 2, ETX égal à 3, ce sont des chars, et non pas des Strings.

const char STX1 = 0x02;
const char ETX1 = 0x03;
const char LF1 = 0x0A;
// etc.

Post en doublon avec Créer une trame contenant des caractères et des données (nbr en décimal).
Fermeture de celui-ci.

Bonjour,

Je souhaiterais réaliser un transfert d'information avec mon arduino nano en utilisant le port UART.

J'ai déjà réalisé une ébauche de programme. Le problème que je rencontre est le suivant, j'arrive à transmettre des données et des caractères séparément mais pas ensemble.

Mon but transmettre un STX(0x02) pour le début de trame puis un LF pour le début du bloc de donnée, une etiquette en char, puis un HT (séparateur), puis des données (en décimal), puis un HT, puis un checksum et pour finir CR fin du bloc de donnée et ETX fin de trame.

#include <SoftwareSerial.h>
#include <String.h>
String trame_complet;
const String STX1 = "2";
const String ETX1 = "3";
const String LF1 = "A";
const String HT1 = "9";
const String CR1 = "D";
const String SP1 = "20";
String etiquette = "ADCO";
int donnee = 123456;
String Som1;



void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);//,SERIAL_7E1);
}

void loop() {
    
    Som1= etiquette + HT1 + var + HT1;
   String Checksum = (Som1 & 0x3F) + 0x20;
   //(etiquette + HT*2 + donnee & 0x3F) + 0x20;
  // put your main code here, to run repeatedly:
  // trame_complet = "";
  trame_complet = STX1 + LF1 + etiquette + HT1 + var + HT1 + Checksum + CR1 + ETX1;
  Serial.print(trame_complet);
  delay(1000);
}

Bonjour,

Le code STX ce n'est pas le code ascii '2' (0x32) mais le code ascii 0x02, idem pour les autres codes.

Il faudrait donc faire
const String STX1 = "\x02";

Topic déplacé depuis la rubrique "réalisation et projets finis" ou elle n'avait rien à faire.

Petite précision :
Transmettre des données avec des caractères de contrôle STX ETX, etc. ne peut se faire que si les données sont transmises en ASCII.

Sinon, il faut passer pas une transmission en mode transparent (utilisation de DLE).

Enfin, l'utilisation de String n'est pas recommandée dans ce cas.
Autant transmettre caractère par caractère :

Serial.print(STX1);
Serial.print(LF1);
// etc.

Yes merci de l'avoir fermer, je mettais tromper entre le forum français et anglais

Alors j'ai essayé en changeant les string par char mais j'obtiens tjrs la même erreur

C:\Users\dleprovost\Desktop\DL\test transmi\test transmi.ino: In function 'void loop()':
C:\Users\dleprovost\Desktop\DL\test transmi\test transmi.ino:24:28: error: 'class String' has no member named 'toChar'
    String Checksum = (Som1.toChar() & 0x3F) + 0x20;
                            ^~~~~~

Le problème n'est pas d'utiliser des String ou des char (bien que l'utilisation des char soit préférable), mais d'utiliser les bon codes pour les caractères de contrôle comme STX ...

Ah oui. Et ça, c'est quoi comme langue ? :wink:

Yes mais mon problème c'est que j'ai tout essayé, d'envoyer en decimal hexa, ou bien les caractères STX mais il m'envoi un S puis T puis un X en ascii.

Aidez moi à comprendre, je suis dans le flou

Voir ma réponse au post #5 pour corriger en faisant le minimum de modifs dans ton programme initial

Bonjour el_paquito

Est-ce une nécessité d'utiliser un protocole STX ETX, sinon pour transférer des données de divers types, il y a les structures.
Ainsi tu mets tes variables diverses dans une structure et tu transmet, en une opération, toutes tes variables avec un:
Serial1.write((byte *)&donneesAtransmettre, sizeof donneesAtransmettre);

et tu reçoit, en une opération, à l'autre bout avec:
Serial1.readBytes((byte*)&donneesAtransmettre, sizeof donneesAtransmettre);

La structure donneesAtransmettre contient tes variables.

Si tu veux un exemple...

Cordialement
jpbbricole

Je dirais oui, on dirait une émulation de compteur électrique

Pour envoyer des données brutes, il suffit de faire des Serial.write(2) ou Serial.write(3) et le problème est réglé.
Beaucoup de personnes pensent qu'il faut construire la chaine complète avant de l'émettre. Mais on peut parfaitement envoyer les infos une par une. Cela économise la RAM puisqu'on ne manipule plus de longues chaines de données.

La première question à se poser est : le protocole est-il imposé ?
Par exemple, il se peut que le récepteur soit un appareil utilisant un protocole bien précis. Dans ce cas, il faut bien se plier à ce protocole.

Je suis absolument d'accord.

Oui mon projet de stage est bien de simuler un compteur afin de tester des indicateurs de conso.

Mon programme est complet grâce à vous, merci.

Maintenant j'aimerais trouver un montage me permettant de fusionner les deux signaux, signal de donnée UART avec la porteuse à 50Khz.

Tout en respectant un paramètre

J'avais comme idée d'utiliser une ampli op en mode comparateur.

Qu'est ce que vous auriez à me proposer sinon comme autre solution ?

Il n'y a rien à comparer.
Il s'agit de laisser passer un signal dans certaines conditions.
Screen-2022-06-08_14-21-59

Ensuite tu mets l'ampli qui va bien pour avoir l'amplitude et la puissance souhaitée.
Éventuellement filtrer avant d'amplifier s'il y a des exigences sur le spectre du signal.

Merci beaucoup pour le montage, tout fonctionne correctement dès à présent