Question autour des String et Char (Arduino)

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Bonjour à tou(te)s

Mon domaine de prédilection est le VB et je m'attaque au langage Arduino que je pense être du Java.

Dans le traitement de mes données actuelles, je perds quelques données et je pense que cela va du traitement que je leur fait subir.
Peut-être saurez-vous m'aiguiller sur une meilleure technique de traitement ...

Mon projet est basé sur 2 boitiers Arduino (client qui fournit les données et serveur que les reçoit) qui communiquent par radio.

Ma GROSSE difficulté est que les comm travaillent avec des Char et que mon buffer est une String --> Je pense qu'il y a des problèmes lors des ajouts et suppression de Char à la String.

Côté client, j'ai une chaine qui stocke les données fournies par un GPS = lignes de texte qui se terminent par un CR+LF (13+10).
Les nouvelles données sont ajoutées en fin de chaine, pendant que l'envoi sur la radio à destination du serveur supprime les paquets émis en tête du buffer.
Code client - ajout des chaines lues du GPS (port série) :
String gpsDatas = "";
void serialEvent() {
while (Serial.available()) {
// Récupère un byte
char inChar = (char)Serial.read();
// Et l'ajoute au buffer
gpsDatas += inChar;
}
}
Code client - Envoi puis retrait des caractères expédiés (radio) :
const uint8_t paquetSize = 8;
String RadioSend(String datas) { // Appelé cycliquement
while ( datas.length() >= paquetSize)
{
// Données à expédier
char cDatas[paquetSize + 1];
datas.toCharArray(cDatas, paquetSize + 1);
// Stoppe l'écoute afin de pouvoir émettre
radio.stopListening();
// Envoie les données - blocage en attendant
bool ok = radio.write( cDatas, sizeof(cDatas) );
if ( ok )
{
// Serial.println("Paquet expedie avec succes : " + String(cDatas));
// On les retire de l'original
datas = datas.substring(paquetSize);
}
else
{
// Serial.println("Paquet non expedie : " + String(cDatas));
}
// Redémarrage de l'écoute
radio.startListening();
delay(20);
}
return datas;
}

Côté serveur, je me contente de récupérer les paquets et de les afficher ou de les transmettre à un logiciel d'interprétation des messages GPS (liaison série).
Code serveur - Réception des données :
String serverDatas;
    char readDatas[paquetSize];
bool done = false;
while (!done)
{
done = radio.read(readDatas, paquetSize);
for ( int r=0; r<=paquetSize-1; r++) {
serverDatas += String(readDatas[r]);
}
delay(5);
}

Code serveur - Détection 13+10 pour couper les lignes et les supprimer du buffer :
    for ( int r=0; r<serverDatas.length()-1; r++ )
{
if ( serverDatas.charAt(r) == char(13) && serverDatas.charAt(r+1) == char(10))
{
// Fin de ligne détectée
Serial.println(serverDatas.substring(0, r+1));
// Supprime ces données du buffer
serverDatas = serverDatas.substring(r+2);
r = 0;
}
}

Alors, m'y suis-je bien pris ?
Merci pour vos remarques.

Vala
Jack [MVP VB]
NB : Je ne répondrai pas aux messages privés
Afficher la suite 

2 réponses

Messages postés
14655
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
12 novembre 2019
90
0
Merci
Hello Jack!

Sauf erreur de ma part, le langage Anduino est basé sur C/C++. Je déplace donc ta demande ;)
Commenter la réponse de BunoCS
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
61
0
Merci
Question subsidiaire :
Dans la dernière boucle 'for', je remets à zéro ma variable 'r' dans le but de redémarrer la recherche depuis le début, sachant que 'serverDatas' n'est plus le même.
En VB, les déclarations d'un 'for' ne sont pas réévaluée durant la boucle.
En Java, est-ce que 'serverDatas' sera rafraichi à la scrutation suivant le 'r = 0' ?
BunoCS
Messages postés
14655
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
12 novembre 2019
90 -
Ici, en C/C++ (et même en Java d'ailleurs) quand tu vas tomber dans ton if(), tu passer r à 0. Au prochain tour de boucle, r sera incrémenté, donc sera égal à 1. Est-ce que c'est cela que tu cherches à faire?
cs_Jack
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
61 -
Ah oui, j'aurai du y penser, merci.
Mon incertitude concerne le contenu de ma chaine déclarée dans la ligne du 'for' : Est-ce que le '.lenght()' sera réévalué avec le nouveau contenu ?
BunoCS
Messages postés
14655
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
12 novembre 2019
90 -
Oui, car ce n'est pas une constante.
Commenter la réponse de cs_Jack