Probleme transtypage bleAddress vers String

Bonjour,

Je m’arrache les cheveux depuis hier soir pour convertir l’adresse mac bluetooth vers du char.
J’ai essayé moulte méthode sans succès :frowning:

Ci-dessous le code que j’aurais pensé fonctionnel

      String  address = advertisedDevice.getAddress().toString();
      char addressChar;
      address.toCharArray(address,20);
      bleQueue.enqueue(addressChar);
      appQueue.enqueue(APP_MSG_BEACON);
error: conversion from 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' to non-scalar type 'String' requested

Une bonne âme pour m’aiguiller ?

l'appel de la méthode advertisedDevice.getAddress() retourne une instance du type BLEAddress

L'appel de la méthode toString() retourne une string C++ de la classe std::string qui supporte c_str(), ou l'opérateur d'accès par tableau avec les crochets [].

par exemple un pointeur sur la représentation de la chaîne sous forme de cString serait donc:

const char * address = advertisedDevice.getAddress().toString().c_str();

Merci pour votre réponse. Je pensais l'avoir essayé ... mais non certainement. J'ai vraiment du mal du mal avec ces pointeurs, je pense comprend ..... mais en faîtes non :(

Si je comprend bien : - Un pointeur est l'adresse d'une zone mémoire, ce qui permet de modifier ou d'accéder à la valeur à cette adresse et donc d'éviter la création de multiple empreintes mémoire en cas de passage à d'autre fonction. - si on déclare une variable «sans pointeur» du type "char adresse", on peut récupérer son adresse avec «&adresse»

Mais dans l'autre sens ? Le code ci-dessous me génère une erreur :

      const char* address = advertisedDevice.getAddress().toString().c_str();
      bleQueue.enqueue(address);
error: invalid conversion from 'const char*' to 'char' [-fpermissive]
       bleQueue.enqueue(address);

La fonction enqueue attend une variable char et non pas un pointeur. Y a t'il une astuce dans ce cas ?

difficile de vous aider sans toutes les informations.

C’est quoi bleQueue ? J’imagine que c’est une instance d’un bibliothèque FIFO mais laquelle ?

Qu’attend la méthode enqueue() ? à voir le message d’erreur on dirait qu’elle attend qu’un seul caractère pas un pointeur

Une cString, c’est un tableau de caractère en mémoire, et toute une chaîne est représentée par le pointeur sur le premier caractère (et le processeur ne connait pas vraiment la longueur, la chaîne se termine quand on rencontre le caractère nul).

Donc vous avez un pointeur sur une cString dans address, si votre fonction enqueue() attend des caractères, vous pourriez faire avec un parcours de tableau (strlen() retourne la longueur d’une cString)

const char* address = advertisedDevice.getAddress().toString().c_str();
for (size_t n=0; n<strlen(address); n++) bleQueue.enqueue(address[n]);

ou alors avec un pointeur qui se balade dans la chaîne

const char* address = advertisedDevice.getAddress().toString().c_str();
while(*address) { // tant que le caractère pointé n'est pas nul
 bleQueue.enqueue(*address); // on l'émet
 address++; // on passe au caractère suivant
}

un petit exemple

String advertisedDeviceAddress = "BONJOUR CECI EST MON ADRESSE"; // simulation 

void setup() {
  Serial.begin(115200);
  const char* address = advertisedDeviceAddress.c_str(); // on va chercher la cString sous jacente (le buffer mémoire qui représente le tableau de caractères)

  Serial.println("VERSION TABLEAU DE CHAR");
  for (size_t n = 0; n < strlen(address); n++) Serial.write(address[n]); 
  Serial.println();
  
  Serial.println("\nVERSION POINTEUR");
  while (*address) {          // tant que le caractère pointé n'est pas nul
    Serial.write(*address);   // on émet ce caractère
    address++;                // on passe au caractère suivant
  }
  Serial.println();
 
}

void loop() {}

Merci ces informations :slight_smile: , je vais me le mettre en mémo… j’ai du mal à l’intégrer