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 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 14 nov. 2019 à 09:36
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 14 nov. 2019 à 09:36
A voir également:
- Arduino split
- Split cam - Télécharger - Messagerie
- Split 4g - Télécharger - Gestion de fichiers
- Hj split - Télécharger - Gestion de fichiers
- Split and merge - Télécharger - PDF
- Split partage abonnement - Accueil - Services en ligne
2 réponses
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
12 nov. 2019 à 12:04
12 nov. 2019 à 12:04
Salut kamal3018,
Vois la fonction standard du C
http://www.cplusplus.com/reference/cstring/strtok/
Dal
Vois la fonction standard du C
strtok():
http://www.cplusplus.com/reference/cstring/strtok/
Dal
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
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
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
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
12 nov. 2019 à 13:32
12 nov. 2019 à 13:32
Comme indiqué, tu peux utiliser
Utilise un compteur qui te permet de savoir sur quel caractère espace
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.
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
Modifié le 12 nov. 2019 à 14:24
Modifié le 12 nov. 2019 à 14:24
Par exemple :
affiche :
#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
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
Modifié le 12 nov. 2019 à 14:32
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
charconsé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.
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
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
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
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
12 nov. 2019 à 18:04
12 nov. 2019 à 18:04
Tu as envoyé quoi à ton arduino ?