Traitement chaîne Hexa

bonjour.

voici un exemple de ce que je reçois sur un port com.

voila comment se compose une trame.

24 20 4B 65 73 73 65 6C 74 65 6D 70 2E 3B 30 30 37 31 3b 32 3b 32 3b B0 43 3B 1A -> Kesseltemp.;0071;2;2;°C;
début de la trame ->Temp chaudière 35.5 °C
fin de la trame
Texte
Séparateur
valeur
index
diviseur
unité

pour composé la trame il y a plusieurs chaines et suivant le moment ou on "lit" il y a plus ou moins de chaines.
au début je vais essayé d'enregistré une trame sur la SD (on commence petit) y'a de la lecture en vue :smiley:

bon j'espére recevoir mon Arduino jeudi 8)

en vb.net (je laisse tombé au profit du C++) j'avais fais ça en suivant des tutos englais

bon déja le début et la fin de la trame , je vais lire: http://arduino.cc/en/Tutorial/StringStartsWithEndsWith

Salut,

Tu reçois ta trame en hexa "brute" (des octets) ou en hexa sous forme de caractéres ?

Dans le principe :

  • tu déclare un tableau de char de nmax éléments (nmax -> taille max de ta trame + 1)
  • tu lis un caractére sur le port série et tu boucle jusqu'à voir arriver le $
  • tu place tout les caractéres recu âpres $ dans le tableau jusqu'a voir arrivé ->
    (pense bien à faire une sécurité (avec un if) pour pas écrire en dehors du tableau)
  • tu "cloture" ensuite la série de caractéres que tu as recu par un '\0' pour pouvoir traiter le tout comme une chaine de caractéres
  • tu utilise sscanf() (et le formatage qui va bien) pour récupérer toute les données dont tu as besoin dans la trame.

merci pour les infos.

je les reçois en brute,c'est le soft qui log qui m'affiche les caractères.

Bon j'avais vraiment rien à faire pour m'occuper :*

Donc ...

#define TAILLE_MAX 32

char texte[TAILLE_MAX / 2], unite;
int valeur, index, diviseur;

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

void loop() {
  if(recupInfo(texte, &valeur, &index, &diviseur, &unite)) {
    Serial.println("Erreur de trame !");
    return;
  }
  Serial.print("Texte: ");
  Serial.println(texte);
  Serial.print("Valeur: ");
  Serial.println(valeur);
  Serial.print("Index: ");
  Serial.println(index);
  Serial.print("Diviseur: ");
  Serial.println(diviseur);
  Serial.print("Unité: ");
  Serial.println(unite);
}

/*
 * Parse une chaine au format $ texte;valeur;index;diviseur;°c/f;
 * Et retourne la valeur des differents champs.
 */
int recupInfo(char *texte, int *valeur, int *index, int *diviseur, char *unite) {
  char c, buf[TAILLE_MAX + 1];
  unsigned char i = 0;

  /* Attente du $ espace */
  do {
    /* Attente de 2 char sur le port série */
    while(Serial.available() < 2);

    /* Tant que chaine != $ espace -> boucle */
  } 
  while(Serial.read() != '

Test et regarde si ça marche :wink:
(J'ai pas le matos pour tester sous la main) && Serial.read() != ' ');

/* Remplissage du buffer /
  do{
    /
Si la chaine a dépassé la taille max du buffer*/
    if(i == (TAILLE_MAX + 1))
      /* retourne 1 -> erreur */
      return 1;

/* Attente d'un char sur le port série */
    while(Serial.available() < 1);

/* Tant que char != 0x1A (fléche) -> boucle */
  }
  while((buf[i++] = Serial.read()) != 0x1A);

/* Cloture la chaine de char */
  buf[i] = '\0';

/* Copie le texte au début de buf[] dans texte[] */
  i = 0;
  while((texte[i] = buf[i]) != ';') i++;
  texte[i] = '\0';

/* Parse la chaine de caractére et extrait les champs /
  if(sscanf(buf + i, ";%d;%d;%d;%c%c;", valeur, index, diviseur, unite) != 4)
    /
Si sscanf n'as pas pu extraire les 4 champs -> erreur
/
    return 1;

/* retourne 0 -> pas d'erreur */
  return 0;
}


Test et regarde si ça marche ;)
(J'ai pas le matos pour tester sous la main)

MERCI :astonished:

le week end va etre long .

en attendant j'ai de quoi étudier.

encore merci

maccoa:
MERCI :astonished:

Pas de quoi :slight_smile:

maccoa:
le week end va etre long .

en attendant j'ai de quoi étudier.

Si t'as des questions / problémes hésite pas :wink:

je vais déjà essayé de comprendre par moi mémé avant de posé des questions.

maccoa:
je viens d'installer une chaudière à pellet qui possède 2 port com .
port com 1-> on envoie une requête en Hexa et elle répond en Hexa avec possibilité de changer certains paramètres.
port com 2-> lui soit il envoie en continue une trame Hexa avec la plupart des données de la chaudière ou soit on peut le configurer en modus RTU avec protocole Supramat Dc97.

Je suppose que c'est la trame qui provient du com2 ?
C'est quand même zarb d'envoyé une tel trame (ascii), c'est loin d'être idéal niveau traitement à la réception ... :~
Tu as de la doc sur ta chaudière ?

je viens de recevoir mon colis!

1° constatation , on ne peut pas les montés l'un sur l'autre?

mege 2560 r2 et shield ethernet r3

les pin sont décaler de 2 broches je vais regarder cela de plus près se soir .

maccoa:
1° constatation , on ne peut pas les montés l'un sur l'autre?

mege 2560 r2 et shield ethernet r3

les pin sont décaler de 2 broches je vais regarder cela de plus près se soir .

mega2560 Rev3 ?
Si oui le décalage est normal, il suffit de brancher la shield 2 broches plus loin :wink:

je viens de testé le serveur web dans les exemples , ça fonctionne bien !

alors les ports com , l'interface com2 peut être utilisée pour établir une connexion avec un MODBUS (RTU ou ACSII), sur les fofo allemand j'ai cru comprendre que le protocole été de type SUPRAMAT DC97 , mais je ne suis pas sur (traduction google).
ou soit elle envoie les valeurs principale de la chaudière toutes les secondes.

le com1 , lui on lui envoie une requet et il répond , par le bias de se port on peut modifier certains paramètre de la chaudière , il n’y a pas de doc officielle , juste sur un forum allemand une poignée de gens (surtout un) on essayés de comprendre.

j'ai commencé à éplucher le programme , quand je tente de le compiler j'ai une erreur , bon j'ai le temps pour comprendre ! comme une nouille j'ai oublié de commande une interface MAX232 =(

connaitriez vous un bon livre en FR sur l'arduino ?

merci à tous

Tu pourrais donner la marque, modèle ou doc de ta chaudière ?
Ça m’intéresse. :grin: :wink:

alors la chaudière c'est une Froling P4 ,
la doc de la "partie electronique" je ne l'ai que sur papier .

si tu n'as pas peur de l'allemand je peut te donné des liens.

tu es intéresser par une chaudière pellet ?

maccoa:
tu es intéresser par une chaudière pellet ?

Pas pour le moment, mais j'explore déjà quelques pistes, peut être une jour lol.
J'ai trouvé quelques doc en français et anglais, montage, configuration, etc, mais pas grand chose sur cette fameuse communication.

pour la communication c'est très peut documenter , du moins chez froling et leur logiciel vaut au alentour de 450€.

bon se soir 1° vrai essais , en lisant le forum storage je suis tombé sur un post "fast serial data logger" http://arduino.cc/forum/index.php/topic,86300.0.html

donc après quelques essais cela fonctionne bien. pour simuler la chaudière je me sers d'un serial port terminale qui envoie une trame complète en loop avec un delay de 1sec.

les données en UTF-8 sont bien sur la SD , arf j'adore !!! :smiley:

je viens de testé le code que tu m'a fourni.

il fonctione sauf si j'envoie toute la trame d'un coup.

24 20 50 72 e9 63 68 61 75 66 66 61 67 65 3b 30 30 30 38 3b 31 3b 31 3b 7a 73 74 3b 4b 65 73 73 65 6c 74 65 6d 70 2e 3b 30 30 37 37 3b 32 3b 32 3b b0 43 3b 41 62 67 61 73 74 65 6d 70 2e 3b 30 30 34 39 3b 33 3b 31 3b b0 43 3b 41 62 67 61 73 74 65 6d 70 20 53 3b 30 30 35 39 3b 31 31 3b 31 3b b0 43 3b 4b 65 73 73 65 6c 73 74 72 67 20 3b 30 30 30 38 3b 34 3b 31 3b 25 3b 50 72 69 6d e4 72 6c 75 66 74 20 3b 30 30 30 30 3b 35 3b 31 3b 25 3b 52 65 73 74 20 4f 32 20 69 73 74 3b 30 32 30 37 3b 36 3b 31 30 3b 25 3b 4f 32 20 52 65 67 6c 65 72 20 20 3b 30 31 30 30 3b 37 3b 31 3b 25 3b 53 65 6b 75 6e 64 e4 72 6c 75 66 74 3b 30 30 30 30 3b 38 3b 31 3b 25 3b 53 61 75 67 7a 75 67 20 53 6f 6c 6c 3b 30 30 33 35 3b 39 3b 31 3b 25 3b 53 61 75 67 7a 75 67 20 49 73 74 3b 31 31 33 34 3b 31 30 3b 31 3b 55 3b 45 69 6e 73 63 68 75 62 20 49 73 74 3b 30 30 30 30 3b 31 32 3b 31 3b 25 3b 4f 32 20 52 65 67 6c 65 72 20 50 65 6c 6c 20 3b 30 30 33 35 3b 31 33 3b 31 3b 25 3b 46 fc 6c 6c 73 74 61 6e 64 3a 20 3b 31 39 32 38 35 3b 31 34 3b 32 30 37 3b 25 3b 41 6e 73 61 75 67 67 65 73 63 68 77 2e 3b 30 31 39 33 3b 31 35 3b 31 30 30 3b 6d 2f 73 3b 53 74 72 6f 6d 20 41 75 73 74 72 61 67 73 3b 31 35 39 30 3b 31 36 3b 31 30 30 30 3b 41 3b 46 fc 68 6c 65 72 20 31 3b 30 30 38 31 3b 31 37 3b 32 3b b0 43 3b 4b 65 73 73 65 6c 73 6f 6c 6c 20 3b 30 30 38 33 3b 31 38 3b 32 3b b0 43 3b 50 75 66 66 65 72 6f 62 65 6e 20 3b 30 30 30 30 3b 32 30 3b 32 3b b0 43 3b 50 75 66 66 65 72 75 6e 74 65 6e 20 3b 30 30 30 30 3b 32 31 3b 32 3b b0 43 3b 50 75 66 66 65 72 70 75 6d 70 65 20 3b 38 31 39 32 3b 32 32 3b 31 3b 25 3b 42 6f 69 6c 65 72 20 31 3b 30 31 30 31 3b 32 33 3b 32 3b b0 43 3b 56 6f 72 6c 61 75 66 20 31 3b 30 30 37 36 3b 32 34 3b 32 3b b0 43 3b 56 6f 72 6c 61 75 66 20 32 3b 30 30 37 36 3b 32 35 3b 32 3b b0 43 3b 48 4b 20 50 75 6d 70 65 20 31 3b 30 30 30 31 3b 32 36 3b 31 3b 20 3b 48 4b 20 50 75 6d 70 65 20 32 3b 30 30 30 31 3b 32 37 3b 31 3b 20 3b 41 75 73 73 65 6e 74 65 6d 70 3b 30 30 31 37 3b 32 38 3b 32 3b b0 43 3b 4b 6f 6c 6c 65 6b 74 6f 72 74 65 6d 70 3b 30 30 30 30 3b 32 39 3b 32 3b b0 43 3b 42 65 74 72 69 65 62 73 73 74 75 6e 64 65 6e 3b 30 38 37 35 3b 33 30 3b 31 3b 68 3b 46 65 68 6c 65 72 3b 4b 65 69 6e 20 46 65 68 6c 65 72 20 3b 39 39 3b 31 3b 20 3b 1a

peut etre que mon logiciel envoie tout d'un coup? la chaudière les envoie les uns après les autre.

maccoa:
je viens de testé le code que tu m'a fourni.

il fonctione sauf si j'envoie toute la trame d'un coup.

peut etre que mon logiciel envoie tout d'un coup? la chaudière les envoie les uns après les autre.

:astonished:
Moi je croyais que ta trame ne contenait que 5 éléments (texte, valeur, index, diviseur, °c/f).

$ Préchauffage;0008;1;1;zst;Kesseltemp.;0077;2;2;°C;Abgastemp.;0049;3;1;°C;Abgastemp S;0059;11;1;°C;Kesselstrg ;0008;4;1;%;Primärluft ;0000;5;1;%;Rest O2 ist;0207;6;10;%;O2 Regler  ;0100;7;1;%;Sekundärluft;0000;8;1;%;Saugzug Soll;0035;9;1;%;Saugzug Ist;1134;10;1;U;Einschub Ist;0000;12;1;%;O2 Regler Pell ;0035;13;1;%;Füllstand: ;19285;14;207;%;Ansauggeschw.;0193;15;100;m/s;Strom Austrags;1590;16;1000;A;Fühler 1;0081;17;2;°C;Kesselsoll ;0083;18;2;°C;Pufferoben ;0000;20;2;°C;Pufferunten ;0000;21;2;°C;Pufferpumpe ;8192;22;1;%;Boiler 1;0101;23;2;°C;Vorlauf 1;0076;24;2;°C;Vorlauf 2;0076;25;2;°C;HK Pumpe 1;0001;26;1; ;HK Pumpe 2;0001;27;1; ;Aussentemp;0017;28;2;°C;Kollektortemp;0000;29;2;°C;Betriebsstunden;0875;30;1;h;Fehler;Kein Fehler ;99;1; ;

La du coup ya nettement plus d'info ...

Si la "vrai" trame à cette tête il faudrait revoir mon systéme en utilisant un tableau de structure parce que sinon ça risque d'être compliqué de gérer tant de données.

merci .

alors je lis un peut tout le forum , j'ai essayé quelques prog pour me faire une idée .

déja je sais se que je voudrais et ne veut pas, une bonne chose déja!

donc pas de pc allumé pour avoir une base de données donc log des Data sur la uSD. je récupère le fichier via serveur web.

aprés soit je fais un log brut et mise en forme via le pc ou si l'arduino peut le faire.

ah oui aussi au début de chaque trame "logger" il faut que j'insert la date et heure .

voila les grande ligne.

les 3/4 prog que j'ai tester le fond mais indépendamment.

le dernier tester fait tout mais lui il log les entrées analogique donc peut être une piste à suivre .

pour le moment j'essaye de comprendre un peut comment cela fonctionne

Si la "vrai" trame à cette tête il faudrait revoir mon systéme en utilisant un tableau de structure

c'est un tableau normale avec X colones et X lignes ?
index1 index2 index3 ...
val1 val2 val3 ...
u1 u2 u3 ...[/table]

pour le nombres de colones je ne sais pas combien il m'en faut (au moins 30 , j ai un index 30)
pour les lignes 4

pour une donnée j'ai 5 champs , toute les données et champs sont séparé par des ";"

si je compte 5 je sais que c'est une nouvelle donnée. -> (substring?)