Problème sûrement très bête mais comme je peine encore beaucoup beaucoup sur le C++ (j'ai pris pascal en LV1 quand j'étais jeune) je sèche.
Mon code (c'est pour envoyer des données par BLE à l'appli FizziQ dont j'ai parlé ailleurs)
void loop() {
if (millis() - Top > periode) {
Top = millis();
// déplacer plus tard le code de mesure dans mesure.cpp
Tension = analogRead(PinTension);
Serial.println(Tension);
double U = Tension/4095*3;
char txt[8];
dtostrf(U, 5, 1, txt);
pCharacteristic->setValue("tension : " + txt); // ça marche pas :-(
// alors que en codant la valeur dans le texte comme :
// pCharacteristic->setValue("tension : 1.2");
// ça marche
pCharacteristic->notify();
}
}
Le compilateur me dit :
Compilation error: invalid operands of types 'const char [11]' and 'char [8]' to binary 'operator+'
Comment fait-on pour concaténer les deux chaines ?
Ne me répondez pas tout de suite, j’ai trouvé une piste avec strncat() mais dans le bus et sur téléphone ça va être compliqué de tester…
Je verrais ça ce soir et je reviens vous embêter si besoin
Je suppose que le type de ta variable est BleCharacteristic ?
Ca ne réponds pas du tout à la question, à laquelle tu as répondu toi même
Mais je me pose la question si ne devrait pas déjà avoir donné la description de la mesure(ex "Tension bat") et donc uniquement donner la valeur ?
Oui, je n'ai pas posté tout le code pour simplifier et de toute façon c'était manifestement un souci de syntaxe et de type pour lequel je merdouille allègrement.
Au passage si qqun pouvait me conseiller un bouquin (papier - je suis un vieux, ou ebook - pour les transports en commun) qui permettent de comprendre de façon solide les bases du C++ pour un ancien pascaleux (qui en plus à pas mal oublié)
J'ai l'impression que la mesure est « poussée » à l'application sous forme d'une chaine dont le formatage est prédéfinie pour l'application : "<identifiant de la grandeur> : <valeur>"
D'ailleurs, seuls les trois premiers caractères de l'identifiant sont pris en compte et manifestement la valeur est tronquée à la première décimale (ça me plaît moyennement ça)
Tu as surement raison, j'avais regardé cette documentation ou j'avais l'impression que tu pouvez donner l'identifiant de la grandeur via le constructeur BleCharacteristic.
Bon, je n'ai pas le montage avec la batterie et le bazar qui m'a servi pour le test d'hier mais avec un ESP tout nu et une petit modif du code, j'arrive à ça :
void loop() {
if (millis() - Top > periode) {
Top = millis();
// déplacer plus tard le code de mesure dans mesure.cpp
//Tension = analogRead(PinTension);
Tension = random(4096);
double U = double(Tension)/4096*3.3;
char val[8];
dtostrf(U, 5, 2, val);
char S[20] = "tension : ";
strncat(S, val, 7);
pCharacteristic->setValue(S);
pCharacteristic->notify();
}
}
Et cela fonctionne comme prévu.
La solution était donc dans la fonction strncat() mais si des critiques sur ce code peuvent être faites, je suis tout preneur...