[Resolu] Mettre sous forme d'une variable le nom d'une classe

Bonjour,

Je débute un peu en C et du coup je sais pas si la formulation du topic utilise le bon vocabulaire, mais rien ne vaut un bon exemple pour mettre au clair :

En gros j'ai une carte arduino UNO reliée à un pc et à une autre carte arduino (Mega). Je communique en série avec les deux périphériques en utilisant l'objet built-in Serial et la bibiliothèque SoftwareSerial, un pour l'odi et l'autre pour l'arduino.

Jusque là tout va bien. Mon problème est que j'utilise une fonction de lecture que et que j'aimerais que cette fonction marche, grace à un argument, à la fois pour la lecture sur le port série de l'ordi et de l'arduino.

voila le code que j'ai écrit et qui évidment ne marche pas. Il dois y avoir un truc avec les pointeur, mais je soit mal les définir soit ce n'est tout simplement pas possible :

#include <SoftwareSerial.h>

int Rx = 12;
int Tx = 13;


char Entree[] = "USB"; //deux entree possible soit par le moniteur serie ("USB")soit par l'autre arduino ("arduino")
void * pointeurPeripherique_Entree = &(Serial);

SoftwareSerial arduinoMega(Rx, Tx);

void setup() {
  Serial.begin(250000);
  while (!Serial) {} //attente de la communication avec l'arduino

  if (Entree == "arduino") {
    pointeurPeripherique_Entree = &(arduinoMega);
    arduinoMega.begin(9600);
  }
  else {
    Serial.println("==> ERREUR variable de peripherique d'entree non reconnu !");
    while (true) {
      ;
    }
  }
}


int lecture(char * data, void *Peripherique_Entree) {
  
  while (Peripherique_Entree.available()) {
    if (Peripherique_Entree.peek() == ('A') || Peripherique_Entree.peek() == 'E') {

      nbbytes = Peripherique_Entree.readBytesUntil('F', data, 10); //format de valeur au max A-182.485F
 }
 return nbbytes;
}

void loop() {
  lecture(pointeurPeripherique_Entree);
}

Pour l'instant ca me retourne l'erreur : request for member 'available' in 'Peripherique_Entree', wich is of non-class type 'void*'
Je sais pas trop comment la résoudre, déjà que je ne sais si je m'y prend bien (et j'imagine que non :D).

Ce n'est pas la totalitée du code car j'ai découpé pour garder que l'essentiel.

Si tu veux pouvoir affecter l'adresse d'un Serial ou d'un SotfwareSerial à une variable, il faut que ta variable soit du même type que la classe mère (Stream). cela s'appelle du polymorphisme.

Stream *pointeurPeripherique_Entree = &Serial;

Ensuite tu utilises pointeurPeripherique_Entree comme un pointeur.

pointeurPeripherique_Entree->available(), etc.

Ahh mais oui, merci j'avais oublié qu cela fonctionnais comme cela, un grand merci à toi, pour ta réponse rapide :smiley:

Je m'incruste sur ce fil de discussion pour une question similaire : sur un ESP32 je définis un client web avec

WifiClient client;

Disons que ce client est déclaré dans la loop. J'aimerais pouvoir l'utiliser dans une fonction appelée par la loop. J'aurai donc des instructions qui évoquent ce client, comme

while (client.available() == 0) {
ou
client.print("blablabla");

Comment passer le client en argument d'appel de ma fonction ? Comme ça ?

void maFonction (Wificlient & client, int x, float y) {

  while (client.available() == 0) {
    ...
  }
}

et comment appeler cette fonction depuis la loop ?

maFonction (client, x, y);

Interruption momentanée ... bad gateway ... service unavailable ...

Reprenons

Oui absolument lesept, avec un passage de paramètre par référence.
Mais il me semble que cela s'écrit WiFiClient.

Merci, je vais tester.