Bonjour tout le monde !
C’est ma semaine de partiels les articles se font donc rares.
Je vais tenter demain ou vendredi de finir mon article sur le DF3120 mais je ne garantie rien
Histoire de vous donner votre dose d’arduino voici un petit morceau de code réalisé pour un membre du forum arduino.
Le but est simple, parser (= parcourir et interpréter) une chaine de caractères reçue sur le port série pour en extraire les données utiles quelle contient.
La chaine type utilisait dans le cadre de ce code a cette forme :
$ texte;valeur;index;diviseur;°c/f;
Le code est facilement modifiable pour coller à n’importe quelle format, il suffit de suivre le principe de base
Sans plus attendre, le code :
// Buffer qui va contenir la trame série
#define TAILLE_MAX 32
// Buffer qui va contenir le texte (taille du buffer / 2, oui j'ai mis ça au pif)
char texte[TAILLE_MAX / 2], unite;
// Données utiles extraites
int valeur, index, diviseur;
// setup()
void setup() {
// Initialisation du port série
Serial.begin(9600);
}
// loop()
void loop() {
// Récupération d'une trame + parsing
if(recupInfo(texte, &valeur, &index, &diviseur, &unite)) {
Serial.println("Erreur de trame !");
return;
}
// Affichage
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 différents 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() != '$' && 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ères 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;
}
Voila voila Enjoy !
Fonctionne parfaitement!!
Publié par maccoa | 24 mars 2012, 14 h 09 minSalut,
j’effectue un projet à peu près pareil, une communication via port série RS232 avec un module GPS, la carte arduino alors traite la trame GPS reçue & l’affiche sur écran, pourriez vous m’orienter vers une documentation qui peut m’aider à établir cette connection et dans un second lieu exploiter ce bout de code??
Publié par Atef | 28 avril 2013, 21 h 14 minVoila de quoi t’occuper
La connexion RS232 – arduino :
http://chuckontech.com/?p=147
Le protocole NMEA :
https://fr.wikipedia.org/wiki/NMEA_0183
GPS + arduino :
http://learn.adafruit.com/adafruit-ultimate-gps/arduino-wiring
http://playground.arduino.cc/Tutorials/GPS
Publié par skywodd | 29 avril 2013, 10 h 57 minThanks a bunch
Publié par Atef | 2 mai 2013, 16 h 41 min