J'aimerais attirer l'attention de manu-428 sur le fait que l'utilisation de String peut potentiellement provoquer de la fragmentation mémoire sur un ARDUINO, y compris MEGA, on ne le répétera jamais assez.
S'il s'agit d'un ESP8266 ou ESP32 c'est différent.
D'autre part "une trame RS232 avec 40 caractères" ne veut strictement rien dire. Il peut s'agir de binaire, d'hexa, d'ASCII.
Un exemple serait le bienvenu.
Si la trame fait exactement 40 caractères de longueur, la lire avec :
int n = Serial.readBytes(buffer, 40);
buffer est une C string : char buffer[40];
n indiquera la longueur effectivement reçue.
Ensuite il suffit d'extraire les 7 chars qui t'intéressent :
L'autre moyen est de pré-dimensionner les Strings :
String buffer;
buffer.reserve(40); // pour la trame
String subString;
subString.reserve(10); // pour la donnée extraite
Placer buffer et subString en données globales (pas dans les fonctions).
Cela évitera les allocations mémoire à répétition.
Avant de parler de la réception de la trame, il conviendrait d'avoir une idée précise de son format :
présence d'un caractère de début, et / ou d'un caractère de fin
ou simplement 40 données brutes sans délimiteur
Dans le premier cas, s'il y a un caractère de fin, la lecture peut être effectivement réalisée dans une String (pré-dimensionnée) à l'aide de Serial.readStringUntil() ou dans une C string à l'aide de Serial.readBytesUntil()
Dans le deuxième cas, Serial.readBytes() devra être utilisé, car il n'existe pas d'équivalent Serial.readString() permettant de lire N caractères.
Mais pour en dire plus il faudrait connaître le format de la trame, et donc préciser la demande.
Il faudrait en premier lieu s'assurer de la présence du début de ligne, parce que si la trame est incomplète, aller y rechercher une information ne rime à rien.
Les caractères "<01>" sont-ils toujours présents ?
Le numéro 01 est-il fixe ou évolue t-il ?
D'autre part, je suppose que la valeur 103.1 mbar n'a pas forcément une longueur fixe.
Aller chercher une sub-string à une position X n'est pas la solution.
L'avantage avec ce genre de solution est que la trame est vérifiée. Si quelque chose ne colle pas,
si par exemple elle ne trouve pas un des éléments recherchés elle retournera ZERO correspondance (0 match).
Si seule la valeur 13.2 est à prendre en compte, on enlève toutes les parenthèses sauf celles qui nous intéressent : ([0-9.]+) en avant dernière position :
char buffer[40]; // longueur maximale de la trame
if (Serial.available() > 0) {
int n = Serial.readBytes(buffer, 40);
// n est la longueur reçue
}
Si par bonheur le système de mesure envoie un retour chariot à la fin de la trame, ce qui ne serait pas étonnant :
char buffer[40]; // longueur maximale de la trame
if (Serial.available() > 0) {
int n = Serial.readBytesUntil('\r', buffer, 40);
// n est la longueur reçue
}
S'il envoie un caractère retour ligne remplace '\r' par '\n'.