RS232 et Arduino

Bonjour,

Je possède un appareil communiquant en RS232, lorsque j'utilise l'hyperterminal de Windows, je doit appuyer sur la lettre "e" pour que l'appareil m'envoie une trame avec des informations à l’intérieur.

Je possède un max232 et un arduino, le max232 est relier à mon appareil et est aussi relier au TX3 et RX3 de mon arduino donc la liaison est normalement établie.

Maintenant pour simuler l'appuie de la lettre E de mon clavier je pensais faire :

Serial3.print("e");

Est ce que cela pourrais fonctionner ? Ou y à t'il une commande spécial à faire ?

Vous avez un mega je suppose?

Pour que le e soit pris en compte sur Windows, devez vous taper sur la touche entrée? Si oui essayez plutôt Serial3.print[b][color=blue]ln[/color][/b]("e");

Bonjour, en effet je doit appuyer sur entrée merci du conseil :wink: je vais tester

Re ! Donc tous fonctionne correctement j'ai eu une trame je suis content !

Maintenant je veux piocher dans la trame des informations, pour cela je met la trame entière dans un tableau, puisque les informations les plus importantes sont dans la fin de trame, j'utilise :

strcpy(message,tab+1350) --> Donc il va prendre tous les caractères du tableau à partir de la 1350eme et jusque la fin du tableau, de ce coter la tous va bien je reçois ce que je cherche.

Maintenant il y a une partie de la trame ( au milieu enfaite ) qui m’intéresse aussi, les caractères qui m’intéresse sont de tab[500] à tab[510], ma question est comment faire pour prendre les compris dans cette limite et les mettre dans une variable (la variable s'apelle message_identification) ?

Cordialement.

cool! bravo.

alors si je comprends bien vous construisez une grosse chaine de caractères avec tout ce qui a été renvoyé sur le port série et ensuite vous voulez faire de l'analyse?

le Mega n'a que 8 KB de mémoire (et un UNO que 2k) donc si je lis bien ci dessus vous avez tab qui a au moins 1350 octets puisque c'est à partir de là que vous lisez et message qui doit être dimensionné pour accepter tout le reste... si vous avez fait 2 tableau de 2k c'est la moitié de votre mémoire que vous utilisez pour pas grand chose puisque les 1350 premiers caractères ne vous intéressent pas...

Au lieu de dupliquer la partie qui vous intéresse vous pourriez faire l'analyse directement dans cette partie. dans votre code ci dessus par exemple si vous conservez cette approche, au lieu de faire le strcpy il suffit de déclarer

char * message = (char *) tab + 1350; comme ça vous avez un pointeur au milieu de votre tableau et vous ne dupliquez pas les octets.

Mais bon ce n'est pas la bonne approche. Ma recommendation serait de ne pas stocker du tout ce qui ne vous intéresse pas au moment de la lecture du port série.

Pouvez vous mettre un exemple de ce que renvoie exactement votre appareil sur le port sériée? est-ce séparé en plusieurs lignes? mettez un peu d'intelligence dans la fonction qui construit tab[] et votre code sera bcp plus simple ensuite

généralement si l'appareil envoie des messages sur des lignes séparées, la bonne approche c'est de traiter chaque ligne à la volée. Vous pouvez faire de l'extraction de contenu avec des fonctions comme [url=http://www.cplusplus.com/reference/cstring/strstr/]strstr[/url]() pour savoir si un mot clé est dans votre ligne, puis utiliser [url=http://www.cplusplus.com/reference/cstring/strtok/?kw=strtok]strtok[/url]() pour extraire les bouts qui vous intéressent (par exemple trouver une valeur et ensuite utiliser [url=http://www.cplusplus.com/reference/cstdlib/atoi/?kw=atoi]atoi[/url]() ou [url=http://www.cplusplus.com/reference/cstdlib/atof/?kw=atof]atof[/url]() pour extraire des valeurs numériques.

Bonjour,

Je pense à ça:

char message_identification[12];
message_identification[11]=’\0’; //terminaison de chaîne.
for(uint8_t i=0; i<11; i++) message_identification*=tab[500+i]; //copie de la sous-chaîne.*

bilbo83:
Bonjour,

Je pense à ça:

char message_identification[12];
message_identification[11]=’\0’; //terminaison de chaîne.
for(uint8_t i=0; i<11; i++) message_identification*=tab[500+i]; //copie de la sous-chaîne.*
[/quote]
faut sans doute être plus générique que ça si le message fait plus de 10 caractères…
Mais là encore pourquoi dupliquer un truc que vous avez déjà en mémoire…
si à partir de tab[500] vous avez un entier que vous voulez lire, faites simplement un
```
*int val;
char tab[2048];

// en supposant que tab contienne bien une chaîne de plus de 500 caractères et soit terminée par ‘\0’
// et qu’à la position 500 on ait un entier.
val = atoi ((char*)tab+500);*

```
la fonction atoi() va ignorer tous les espaces avant un entier et s’arrête dès qu’elle trouve un symbole qui n’est pas une représentation ascii d’un entier (elle sait lire le signe ‘-’ pour signifier un nombre négatif) par exemple val = atoi ("      123 coucou); // val = 123 mais s’il y a des mauvais caractères au début de la chaine alors ça retourne 0. val = atoi (" hello123 coucou); // val = 0 → donc il faut se placer au bon endroit dans le buffer.

OK J-M-L, mais la question porte sur: "les caractères qui m'intéresse sont de tab[500] à tab[510]".

Ensuite il se rendra compte que de multiplier les fonctions de décodage, c'est pas top question optimisation du code et espace mémoire occupé.

bilbo83: OK J-M-L, mais la question porte sur: "les caractères qui m'intéresse sont de tab[500] à tab[510]".

Ensuite il se rendra compte que de multiplier les fonctions de décodage, c'est pas top question optimisation du code et espace mémoire occupé.

OK mais ce n'est pas nécessaire de les dupliquer pour les lire...