Invalid conversion from 'const char*' to 'char*' [-fpermissive]

Bonjour à tous,

Je suis en train de réaliser une web radio avec un ESP32, un MAX 98357 et une écran Nextion de 2.4".

Pour ce faire, je me sers de différentes réalisation trouvées en ligne en les adaptant à mes besoins.

Je butte sur le problème d’afficher le titre du morceau qui passe et qui est disponible dans les infos du stream radio sous cette forme : info StreamTitle="Loggins & Messina - Danny’s Song "

Je me mélange les pinceaux avec Const char * et char* et malgré mes recherches sur le sujet j’ai du mal à comprendre comment cela fonctionne.

J’ai donc le message d’erreur indiqué dans le titre : invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive] lorsque cette partie du code se compile :

void audio_showstreamtitle(const char *title) {
  Serial.print("streamtitle "); Serial.println(title);
  NEXTION_SendString("t1", title);
}

void NEXTION_SendString (char *ID, char *string)
{
  char buf[50];
  int len = sprintf (buf, "%s.txt=\"%s\"", ID, string);
  Serial2.write(buf, len);
  Serial2.write(0xff);  // We always have to send this three lines after each command sent to the nextion display.
  Serial2.write(0xff);
  Serial2.write(0xff);
}

Pouvez vous m’aider à écrire le bon code pour afficher le titre ?

Voici mon code complet :

/////////////////////////////////////////////////////////////////
//         ESP32 Internet Radio Project I2S    v1.00           //
//    https://github.com/schreibfaul1/ESP32-audioI2S/wiki      //
//
//     Modified by JMD to add channel selector buttons         //
//     to Nextion display.                                     //
/////////////////////////////////////////////////////////////////

#include "Arduino.h"
#include "WiFi.h"
#include "Audio.h"
#define nextion Serial2 // sur esp 32 gpio 16 et 17- ajout JMD
#define __DEBUG__

#define I2S_DOUT      26  // connect to DAC pin DIN
#define I2S_BCLK      27  // connect to DAC pin BCK
#define I2S_LRC       25  // connect to DAC pin LCK

uint8_t volume = 6;        // range is 0 to 21

#define SERIAL_BAUDRATE 9600
#define NB_BYTES_MSG 7            // Exemple : 65 00 01 01 FF FF FF (bouton "allumer led") ou bien 65 00 03 01 FF FF FF (bouton "éteindre led")

unsigned char incomingByte;       // variable de stockage des données entrantes (1 octet à la fois)
unsigned char msg[NB_BYTES_MSG];  // variable qui contiendra le message entier
bool msgEnCours = false;          // indique si oui ou non il y a un message en cours de réception
int idx = 0;

int radioStation = 0;
int previousRadioStation = -1;
String titre;

Audio audio;

const char* ssid =     "xxxxxxxxx";
const char* password = "xxxxxxxl";

char *host[25] = {"http://wpr-ice.streamguys.net/wpr-music-mp3-96",
                  "http://listen.livestreamingservice.com/181-classicaljazz_128k.mp3",
                  "http://listen.livestreamingservice.com/181-breeze_128k.mp3",
                  "http://listen.livestreamingservice.com/181-eagle_128k.mp3",
                  "http://listen.livestreamingservice.com/181-classical_128k.mp3",
                  "http://listen.livestreamingservice.com/181-rock40_128k.mp3",
                  "http://listen.livestreamingservice.com/181-blues_128k.mp3",
                  "http://listen.livestreamingservice.com/181-beatles_128k.mp3",
                  "http://listen.livestreamingservice.com/181-70s_128k.mp3",
                  "http://listen.livestreamingservice.com/181-goodtime_128k.mp3",
                  "http://listen.livestreamingservice.com/181-mellow_128k.mp3",
                  "http://listen.livestreamingservice.com/181-greatoldies_128k.mp3",
                  "http://listen.livestreamingservice.com/181-yachtrock_128k.mp3",
                  "http://listen.livestreamingservice.com/181-uktop40_128k.mp3",
                  "http://listen.livestreamingservice.com/181-classicalguitar_128k.mp3",
                  "http://listen.livestreamingservice.com/181-lite80s_128k.mp3",
                  "http://listen.livestreamingservice.com/181-soul_128k.mp3",
                  "http://airspectrum.cdnstream1.com:8114/1648_128",
                  "http://airspectrum.cdnstream1.com:8000/1261_192",
                  "https://vip2.fastcast4u.com/proxy/magicfla?mp=/1",
                  "https://stream-mz.planetradio.co.uk/planetrock.mp3",
                  "http://icecast.radiofrance.fr/fip-midfi.mp3",
                  "http://icecast.radiofrance.fr/fipjazz-midfi.mp3",
                  "http://icecast.radiofrance.fr/fiprock-midfi.mp3",
                  "http://icecast.radiofrance.fr/fbprovence-midfi.mp3"
                 };

void drawRadioStationName(int id)
{
  //  Serial.print("ID= "); Serial.println(id);
  switch (id)
  {
    case 0: NEXTION_SendString("t0", "WPR Wescosin"); break;
    case 1: NEXTION_SendString("t0", "181.FM Classical Jazz"); break;
    case 2: NEXTION_SendString("t0", "181.FM The Breeze"); break;
    case 3: NEXTION_SendString("t0", "181.FM The Eagle"); break;
    case 4: NEXTION_SendString("t0", "1811.FM classical"); break;
    case 5: NEXTION_SendString("t0", "181.FM rock40"); break;
    case 6: NEXTION_SendString("t0", "181.FM blues"); break;
    case 7: NEXTION_SendString("t0", "181.FM beatles"); break;
    case 8: NEXTION_SendString("t0", "181.FM 70s"); break;
    case 9: NEXTION_SendString("t0", "181.FM goodtime"); break;
    case 10: NEXTION_SendString("t0", "181.FM mellow"); break;
    case 11: NEXTION_SendString("t0", "181-greatoldies"); break;
    case 12: NEXTION_SendString("t0", "181.FM yachtrock"); break;
    case 13: NEXTION_SendString("t0", "181.FM uktop40"); break;
    case 14: NEXTION_SendString("t0", "181.FM classicalguitar"); break;
    case 15: NEXTION_SendString("t0", "181.FM lite80s"); break;
    case 16: NEXTION_SendString("t0", "181.FM Soul"); break;
    case 17: NEXTION_SendString("t0", "181.FM lite80s"); break;
    case 18: NEXTION_SendString("t0", "Easy Hits Florida"); break;
    case 19: NEXTION_SendString("t0", "Magic Oldies Florida"); break;
    case 20: NEXTION_SendString("t0", "Classic Rock Planet"); break;
    case 21: NEXTION_SendString("t0", "FIP Midfi"); break;
    case 22: NEXTION_SendString("t0", "FIP Jazz"); break;
    case 23: NEXTION_SendString("t0", "FIP Rock"); break;
    case 24: NEXTION_SendString("t0", "France Bleue Provence"); break;
  }
}

void setup() {
  // Serial.begin(115200);

  Serial2.begin(SERIAL_BAUDRATE);       // Vitesse de transmission série (vers ECRAN LCD)
  Serial.begin(SERIAL_BAUDRATE);        // Vitesse de transmission série (vers PC)
  delay(10);                            // Attente (en milli-secondes)
  Serial2.flush();                      // Vide le buffer de réception de données du port série

  // Serial.println("connexion wifi");
  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());

  audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
  audio.setVolume(volume);

}//Fin Setup

void loop() {
  if (radioStation != previousRadioStation)
  {
    station_connect(radioStation);
    previousRadioStation = radioStation;
  }

  if (Serial2.available()) {             // Test si quelque chose en attente de lecture sur le port série 3 (côté écran LCD)

    Serial.println("loop");
    incomingByte = (char)Serial2.read();     // Lit 1 octet de ce qu'il y a en attente

    // Affichage de l'octet lu sur le port série de l'ECRAN pour l'afficher sur le port série du PC
    Serial.print("Octet reçu (HEX) = ");
    Serial.println(incomingByte, HEX);

    // Test si c'est le début d'une chaine (commence par 65)
    if (incomingByte == 0x65) {
      msg[0] = 0x65;
      msgEnCours = true;
      idx = 1;
    }
    else
    {
      // Si c'est la suite, on enregistre
      if (msgEnCours == true) {
        msg[idx] = incomingByte;
        idx++;
      }

      // On regarde si on est au bout du message ou pas
      if (idx == NB_BYTES_MSG) {
        changeStation();
        changeVolume();
        msgEnCours = false;
        idx = 0;
      }
    }
  }

  audio.loop();
}//Fin Loop

void station_connect(int station_no) {
  delay(1000);
  audio.connecttohost(host[station_no]);
  //  Serial.print("Radio = "); Serial.println(host[station_no]);
  //  Serial.print("Radio numero = "); Serial.println(station_no);
  drawRadioStationName(station_no);

}

void audio_info(const char *info) {
  Serial.print("info        "); Serial.println(info);
}

void audio_showstation(const char *station) {
  Serial.print("station     "); Serial.println(station);
}

void audio_showstreamtitle(const char *title) {
  Serial.print("streamtitle "); Serial.println(title);
  NEXTION_SendString("t1", title);
}

void NEXTION_SendString (char *ID, char *string)
{
  char buf[50];
  int len = sprintf (buf, "%s.txt=\"%s\"", ID, string);
  Serial2.write(buf, len);
  Serial2.write(0xff);  // We always have to send this three lines after each command sent to the nextion display.
  Serial2.write(0xff);
  Serial2.write(0xff);
}

void changeStation() {
  // Affichage
  Serial.print("Message reçu (HEX) : ");
  Serial.print(msg[0], HEX);
  Serial.print(":");
  Serial.print(msg[1], HEX);
  Serial.print(":");
  Serial.print(msg[2], HEX);
  Serial.print(":");
  Serial.print(msg[3], HEX);
  Serial.print(":");
  Serial.print(msg[4], HEX);
  Serial.print(":");
  Serial.print(msg[5], HEX);
  Serial.print(":");
  Serial.println(msg[6], HEX);
  // Test si bouton 1 appuyé
  if (msg[0] == 0x65 && msg[1] == 0x00 && msg[2] == 0x02) {
    if (radioStation < 24) //Change value (24) to the number of stations to n-1. In my case there are 25 stations pre-programmed.
      radioStation++;
    else
      radioStation = 0;
  }
  // Test si bouton 2 appuyé
  if (msg[0] == 0x65 && msg[1] == 0x00 && msg[2] == 0x03) {
    if (radioStation > 0)
      radioStation--;
    else
      radioStation = 24; //Change value (24) to the number of stations to n-1. In my case there are 25 stations pre-programmed.
  }
}
void changeVolume() {

  // Test si bouton Volume up appuyé
  if (msg[0] == 0x65 && msg[1] == 0x00 && msg[2] == 0x07) {
    if (volume < 23)
      volume++;
    else
      volume = 0;
  }
  // Test si bouton volume down appuyé
  if (msg[0] == 0x65 && msg[1] == 0x00 && msg[2] == 0x06) {
    if (volume > 0)
      volume--;
    else
      volume = 20; //V=0 à 21 to v-1.
  }
  audio.setVolume(volume);
  Serial.print("Volume = "); Serial.println(volume);
}

Merci d’avance.

Bonjour

Change la déclaration de NEXTION_SendString:
void NEXTION_SendString (const char *ID, const char *string)

Et tu pourrais simplifier en utilisant une structure qui peut stocker l’adresse de l’hôte et le titre à afficher, puis tout mettre dans un tableau comme ça tu n’aurais plus besoin du switch

(et ça reste un warning donc ça ne gêne pas la compilation et dans ce cas vous ne faites rien de mal au char* donc ce n’est pas un problème)

Bonjour Guix, J-M-L,

Merci pour la réponse, ça fonctionne!

Guix, j’aime toujours optimiser mes Sketchs et j’aimerais bien que tu m’aiguilles sur la façon de procéder en utilisant une structure?

Merci.

Un truc comme ça :

struct radio_t
{
	const char * titre;
	const char * adresse;
};

const radio_t radios[] =
{
	{ "WPR Wescosin",          "http://wpr-ice.streamguys.net/wpr-music-mp3-96"                    },
	{ "181.FM Classical Jazz", "http://listen.livestreamingservice.com/181-classicaljazz_128k.mp3" },
};

const size_t numRadios = sizeof( radios ) / sizeof( radio_t );

void drawRadioStationName( size_t id )
{
	if ( id < numRadios )
	{
		NEXTION_SendString( "t0", radios[ id ].titre );
	}
}

Bonsoir guix,

Merci, je vais tester ça et surtout, essayer de comprendre le principe !

A bientôt.

De rien :slight_smile:

J’ai un peu modifié le code, surtout pour corriger une faute d’inattention ( <= au lieu de < )

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