Question autour des String et Char (Arduino)

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - Modifié par cs_Jack le 3/10/2014 à 15:21
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 - 6 oct. 2014 à 09:33
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
A voir également:

2 réponses

BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
3 oct. 2014 à 15:11
Hello Jack!

Sauf erreur de ma part, le langage Anduino est basé sur C/C++. Je déplace donc ta demande ;)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
Modifié par cs_Jack le 3/10/2014 à 15:17
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' ?
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
Modifié par BunoCS le 3/10/2014 à 16:06
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?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
3 oct. 2014 à 23:49
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 ?
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
6 oct. 2014 à 09:33
Oui, car ce n'est pas une constante.
0
Rejoignez-nous