Découpage message sur arduino

Fermé
kamal3018 Messages postés 6 Date d'inscription mardi 12 novembre 2019 Statut Membre Dernière intervention 14 novembre 2019 - 12 nov. 2019 à 11:58
[Dal] Messages postés 6044 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 23 janvier 2023 - 14 nov. 2019 à 09:36
Bonjour

j'espère que vous allez bien
je voulais savoir si vous pouvez m'aidé
je reçoit se message "X00/00/00 04:45:03 1234 000 B J 019074 A N 00 G 00.00" par rs 232 sur arduino et je voulais découpé à chaque espace " " pour récupéré quelque partie après l'espace pour les imprimés sur un écran lcd16/2

Merci à vous

2 réponses

[Dal] Messages postés 6044 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 23 janvier 2023 1 040
12 nov. 2019 à 12:04
Salut kamal3018,

Vois la fonction standard du C
strtok()
:

http://www.cplusplus.com/reference/cstring/strtok/


Dal
0
kamal3018 Messages postés 6 Date d'inscription mardi 12 novembre 2019 Statut Membre Dernière intervention 14 novembre 2019
12 nov. 2019 à 12:57
re
moi j'ai ce code



#include <LiquidCrystal.h>
// chaine de caractères pour contenir les données brutes
String inputString = "";
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
// pour savoir si la chaine est complète
boolean stringComplete = false;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int cnt = 0; // nombre de données découpées
String data[10]; // stockage des données découpées

void setup() {
lcd.begin(16, 2);
Serial.begin(9600);
lcd.setCursor(0,0);
lcd.print(" Scanner un ANT");
lcd.setCursor(0,1);
lcd.print(" Scan een ANT");
}

void loop() {
// si le message est complet
if (stringComplete) {
// on le découpe à chaque espace ' '
// et on stocke les bouts dans un tableau
splitString(inputString, ' ');

// appel des fonctions selon le premier sélecteur
if (data[0] == "X00/00/00") {
light(data[1].toInt(), data[2].toInt());
}


// vide la chaine
inputString = "";
stringComplete = false;
}
}

// serialEvent()
void serialEvent() {
while (Serial.available()) {

// récupérer le prochain octet (byte ou char) et l'enlever
char inChar = (char)Serial.read();
// concaténation des octets reçus
inputString += inChar;


// caractère de fin pour notre chaine
if (inChar == '\n') {
stringComplete = true;
}
}
}

// méthode pour découper le message avec un séparateur (ou "parser")
void splitString(String message, char separator) {
int index = 0;
cnt = 0;
do {
index = message.indexOf(separator);
// s'il y a bien un caractère séparateur
if(index != 0) {
// on découpe la chaine et on stocke le bout dans le tableau
data[cnt] = message.substring(0,index);
cnt++;
// on enlève du message le bout stocké
message = message.substring(index+1, message.length());
} else {
// après le dernier espace
// on s'assure que la chaine n'est pas vide
if(message.length() > 0) {
data[cnt] = message.substring(0,index); // dernier bout
cnt++;
}
}
} while(index >=0); // tant qu'il y a bien un séparateur dans la chaine
}

// fonction personnalisable
void light(int pin, int brightness) {


Serial.print("Tram ");
Serial.print(pin);
Serial.print(" POST ");
Serial.println(brightness);

//analogWrite(pin,brightness);
}


en fait je reçois ce message à chaque passage d'un tram "X00/00/00 04:45:03 1234 000 B J 019074 A N 00 G 00.00" et je doit afficher ses information sur un écran lcd 16/2

je recouper 1234,B,A,N,G

et je les imprime par exemple : Tram 1234 Post B
Ant A MdF N ED G

Merci à vous
0
[Dal] Messages postés 6044 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 23 janvier 2023 1 040
12 nov. 2019 à 13:32
Comme indiqué, tu peux utiliser
strtok()
avec le caractère espace. Vois l'exemple dans la documentation dont je t'ai donné le lien et comment la boucle lançant
strtok()
permet de récupérer les données entre le(s) caractère(s) séparateur(s). Là tu aurais un seul caractère séparateur : l'espace et ton appel serait du genre
pch = strtok (str," ");
au lieu de
pch = strtok (str," ,.-");
dans l'exemple donné.

Utilise un compteur qui te permet de savoir sur quel caractère espace
strtok() 
s'est arrêté, par exemple "1234" se trouverait à la 3ème itération de la boucle, et pour décider si tu exploites ou non ce qu'a trouvé
strtok()
sur l'itération donnée ou si tu passes au caractère espace suivant parce que tu décides d'ignorer une partie de la chaîne.
0
[Dal] Messages postés 6044 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 23 janvier 2023 1 040
Modifié le 12 nov. 2019 à 14:24
Par exemple :
#include <stdio.h>
#include <string.h>

int main(void) {
    char str[255] = "X00/00/00 04:45:03 1234 000 B J 019074 A N 00 G 00.00";
    char * pch;
    int count = 0;

    pch = strtok(str," ");
    while (pch != NULL) {
        count++;
        if (count == 3)
            printf("Tram %s\n",pch);
        pch = strtok(NULL, " ");
    }

    return 0;
}

affiche :
Tram 1234
0
[Dal] Messages postés 6044 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 23 janvier 2023 1 040
Modifié le 12 nov. 2019 à 14:32
note que
strtok()
est une fonction C et fonctionne sur des chaînes C (zone mémoire avec des
char
consécutifs terminés par un
'\0'
) stockées dans une zone mémoire où le programme doit être mesure d'écrire, puisque la fonction va "saucissonner" la chaîne de départ, en écrasant les caractères séparateurs qu'elle trouve avec des
'\0'
, créant ainsi autant de sous-chaînes que nécessaire.
0
kamal3018 Messages postés 6 Date d'inscription mardi 12 novembre 2019 Statut Membre Dernière intervention 14 novembre 2019
12 nov. 2019 à 14:45
j'ai injecté le code sur mon arduino et j'ai envoyé l'exemple sur mon arduino via serial par un câble rs232] et j'ai rien de retour je reçois que des carré
le message que je reçois X00/00/00 04:45:03 1234 000 B J 019074 A N 00 G 00.00 chaque fois change et chaque tram à son numéro j'ai prie exemple d'un tram que le numéro 1234
0
[Dal] Messages postés 6044 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 23 janvier 2023 1 040
12 nov. 2019 à 18:04
Tu as envoyé quoi à ton arduino ?
0