Question autour des String et Char (Arduino)

Signaler
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Messages postés
14837
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
15 octobre 2020
-
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

2 réponses

Messages postés
14837
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
15 octobre 2020
92
Hello Jack!

Sauf erreur de ma part, le langage Anduino est basé sur C/C++. Je déplace donc ta demande ;)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
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' ?
Messages postés
14837
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
15 octobre 2020
92
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?
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
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 ?
Messages postés
14837
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
15 octobre 2020
92
Oui, car ce n'est pas une constante.