Recuperation Infos serie ->Parse -> Ethernet

Bonjour a tous,

Voila j’ai quelques difficultes avec le stockage d’une trame Serie, le fait de pouvoir la parser et ensuite la transferer via ethernet sur une page (en utilisant PUT comme pour pachube, je pense)

Donc je me tourne vers vous pour avoir un peu d’aide.

Donc pour commencer, avant de parser la trame il faut la stocker je pense. J’ai essayer plusieurs technique mais sans succes. Voici le type de trame que je souhaite recevoir :

Trame DIASI: FF FE 2F 53 C3 24 97 38 0B A6 0F D0 F5 20

>53C32497380BA60FD0F520<

Mode: TEST
Code INFO: 316
Utilisation: INFORMA
MMSI / texte:   C7518
Spare: 0
Aux: 1 = 121.5 HKz

Identifiant: A 7 8 6 4 9 2 E 7 0 1 7 4 C 1

Voila donc si certains d’entre vous pouvaient deja m’aiguiller sur comment parser cette trame en sachant que les infos utiles sont : TEST - 316 - INFORMA - C7518 -0 - 121.5 HKz et A 7 8 6 4 9 2 E 7 0 1 7 4 C 1

Merci Beacuoup

Salut,

Tu utilises Arduino 1.0 ou Arduino 0023 (ou 0022, etc.) ?

En supposant que tout est parfait et qu’il n’y a jamais d’erreurs, tu peux faire quelque chose du genre avec la 1.0 :

char mode[8];
Serial.find("Mode: ");
Serial.readBytesUntil('\r', mode, 8);

char info[8];
Serial.find("INFO: ");
Serial.readBytesUntil('\r', info, 8);

char util[16];
Serial.find("Utilisation :");
Serial.readBytesUntil('r', util, 16);

char texte[8];
Serial.find("texte: ");
Serial.readBytesUntil('\r', texte, 8);

char spare[8];
Serial.find("Spare: ");
Serial.readBytesUntil('\r', spare, 8);

char aux[8];
Serial.find(" = ");
Serial.readBytesUntil(' ', aux, 8);

char id[32];
Serial.find("Identifiant: ");
Serial.readBytesUntil('\r', id, 32);

Pour le 316 et le 0 si tu veux récupérer les valeurs numériques au lieu de simplement copier les chiffres, tu peux utiliser Serial.parseInt(), de même pour 121.5 avec Serial.parseFloat().

Merci pour l’aide, mais j’ai peur que ces fonctions ne soient pas assez rapide ou quelques choses dans le genre, car voici le resultat que j’obtiens :
TEST316
316
7çÌúùîµ
¾
0
121.5 MH7çÌúùîµ
A 7 8 6 4 9GÀGG

Ai-je fais une erreur?

Voici le code que j’utilise :

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3);

void setup() {
  // initialize serial:
  Serial.begin(9600);
  mySerial.begin(9600);

}

void loop() {
  while (mySerial.available()) {
char mode[8];
mySerial.find("Mode: ");
mySerial.readBytesUntil('\r', mode, 8);

char info[8];
mySerial.find("INFO: ");
mySerial.readBytesUntil('\r', info, 8);

char util[16];
mySerial.find("Utilisation :");
mySerial.readBytesUntil('\r', util, 16);

char texte[8];
mySerial.find("texte: ");
mySerial.readBytesUntil('\r', texte, 8);

char spare[8];
mySerial.find("Spare: ");
mySerial.readBytesUntil('\r', spare, 8);

char aux[8];
mySerial.find(" = ");
mySerial.readBytesUntil('\r', aux, 8);

char id[32];
mySerial.find("Identifiant: ");
mySerial.readBytesUntil('\r', id, 32);

Serial.println(mode);
Serial.println(pays);
Serial.println(util);
Serial.println(texte);
Serial.println(spare);
Serial.println(aux);
Serial.println(id);
  }
}

Ok j’ai bien avancé, maintenant je n’ai plus besoin que d’une information, et voici le code que j’ai :

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

void setup() {
  // initialize serial:
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop() {
char id[53];
memcpy(id,0,54);
mySerial.find("Trame DIASI: ");
mySerial.readBytesUntil('\r', id, 53);
Serial.print("Trame :");
Serial.println(id);
}

Le probleme est que j’ai a chaque loop “trame :” qui s’affiche, j’ai essayer plusieurs facon de tester si id est vide, mais rien ne fonctionne…

Comment tester si id est bien vide?

Salut,

Tu as une erreur dans ton prog :

char id[53];
memcpy(id,0,54);

C'est pas memcpy mais memset que tu devrait utiliser, de plus ce serait 53 et non 54 en 3eme argument.

Ensuite comme il s'agit d'une déclaration tu peut faire :

char id[53] = {0};

(Ps: vu que tu va écrire dedans par la suite il n'est pas obligatoire d'initialiser le tableau)

Le probleme est que j'ai a chaque loop "trame :" qui s'affiche, j'ai essayer plusieurs facon de tester si id est vide, mais rien ne fonctionne....

Comment tester si id est bien vide?

mySerial.readBytesUntil('\r', id, 53); retourne le nombre de byte placé dans le buffer, si == 0 alors id est vide.

Nickel ca reponds bien a ce que je voulais faire merci beaucoup, par contre, j'ai toujours des caracteres qui apparaissent en fin de trame, et je ne comprends pas d'ou cela provient, par exemple :

Trame :FF FE D0 90 12 7B 92 92 2B C0 2B 49 68 F5 04 70 22 00w Trame :FF FE D0 90 1A 0A 80 4A E1 01 76 9A C9 B4 03 8A A1 00w

Donc d'ou provient ce w? et surtout comment faire pour qu'il n'apparaisse plus?

Ton tableau contient 53 octets, qui correspondent bien aux 53 caractères de ta trame (en comptant les espaces). Par contre Serial.println() s'arrête au premier caractère non nul, donc si tu veux éviter d'avoir des caractères aléatoires qui s'affichent après il faut replacer char id[53] = {0}; par char id[54] = {0};.

Ok, je vais tester ca,

Autre question, je souhaiterais etre en mesure de supprimer les espaces dans id, mais je ne trouve aucune fonction arduino capable de faire cela avec char (avec string.replace pas de probleme mais char...)

J'ai beau essayer plusieurs fonctions glaner a droite et a gauche sur internet, je ne trouve rien capable de supprimer les espaces dans mon :

char id[53] = "FF FE D0 90 12 7B 92 92 2B C0 2B 49 68 F5 04 70 22 00";

ce qui me permettrait dans la suite de Poster correctement la vairable id via ethernet.