Syntaxe C++ pour concaténer du texte

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 ?

Merci de votre aide

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 :wink:

L'opérateur + fonctionne avec les String mais pas avec les c-string.
strncat est la solution.

1 Like

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 :slight_smile:
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é)

je me suis inspiré de ça : https://www.fizziq.org/externalsensors

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...

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.