Creer trame de caractère

Bonjour,

Je dois créer une trame de caractère pour envoyer une ID de l'arduino à un PC.

la trame à cette structure
1er octet code fonction => 0 identification
2nd octet longueur de la chaine de caractère
enfin les octets suivant chaque caractère de la chaine

exemple : 1er octet => 0x00
2nd octet => 0x03
3eme octet => 0x4d
etc ....

voici le code que j'ai utiliser mais l'ID n'est pas reconnu par le PC

const char name[5] = {0x00, 0x03, 0x4f, 0x56, 0x48};
int i;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
   for (int i = 0; i < 5; i++) {
   Serial.println(name[i]);
  delay(500);
  }
} 

Le println ajoute des caractères cachés (fin de ligne et retour à la ligne). Essaye avec print

Ou vous pouvez utilisez write pour envoyer des octets

const uint8_t trame[] = {0x00, 0x03, 0x4f, 0x56, 0x48};
…
  Serial.write(trame, sizeof trame);  // envoyer la trame sur le port série 

Merci pour vos réponse. je vais modifier mon code.

print() peut aussi transformer certains caractères, par exemple 0x0A (linefeed) en saut de ligne, ou 0x0D (return) en retour chariot.
Donc si l'on veut envoyer les caractères bruts, sans qu'ils soient interprétés, write() est la seule solution, comme le préconise J-M-L.

non print ne les modifie pas, ça envoie bien ces codes, c'est le terminal qui les interprète.

par exemple

char test[] = {'H', 'E', 'L', 'L', 'O', 0x0A, 0x0D, 0x00};
const char * testPtr = "HELLO\x0A\x0D";

void setup() {
  Serial.begin(115200);
  Serial.print(test);
  Serial.print(testPtr);
}

void loop() {}

donne dans le terminal série en vue hexadécimal (CoolTerm ici)


➜ on a reçu le code ASCII des caractères pour HELLO ainsi que les octets pour les 2 autres

Par contre - et c'est important pour un flux binaire - Il faut s'assurer que la trame est une cString - c'est à dire terminée par un caractère nul qui ne sera pas envoyé et bien sûr ça veut dire aussi qu'on ne peut pas avec print envoyer un octet nul.

c'est pour cela que write() est plus adapté puisqu'on passe un pointeur sur un buffer et la taille du buffer et tous les octets sont envoyés, quelle que soit la valeur.

Oui, c'est vrai :grimacing:

Merci pour les infos. Voici le code qui fonctionne.

const uint8_t name[] = {0x00, 0x03, 0x4f, 0x56, 0x48, 0x00};
int i;

void setup()
{
  Serial.begin(19200);
}

void loop()
{
   for (int i = 0; i < 6; i++) {
   Serial.write(name, sizeof name);
  delay(500);
  }
} 

Vous balancez 6 fois la trame …

void loop() {
  Serial.write(name, sizeof name);
  delay(500);
} 

Oups...

J'ai oublier d'enlever cette ligne.

Merci JML.

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