PlatformIO afficher une valeur sur 16 bits en hexa

Bonjour tout le monde,
Je teste un ADC MCP3208 avec la fct suivante :

uint16_t litADC3208(SPIClass *spi, const int pin, byte voie){
  uint16_t lecture = 0;
  uint16_t dataIn = 0, dataIn1 = 0;
  spi->beginTransaction(SPISettings(ADC_CLK, MSBFIRST, SPI_MODE0));
  digitalWrite(pin, LOW);
  
  uint8_t dataOut = 0b00000100 | voie >> 3; // envoi le bit de start, single et non différentiel et le MSB du num de la voie
  dataIn = spi->transfer(dataOut); // et recoit 8 bits non significatif
  dataOut = 0b00000000 | (voie & 0b00000011) << 6;  // envoi les 2 LSB du numéro de la voie
  dataIn = spi->transfer(dataOut); // et recoit 4 MSB dans les 4 LSB 
  dataIn1 = spi->transfer(0x00);  // envoi 0 et reçoit les 8 bits restant

  lecture = dataIn & 0x0F;  // les filtre
  lecture = lecture << 4;   // les positionne en poids forts
  lecture = lecture | dataIn1; // ajoute les 8 bits de poids faible
  
  digitalWrite(pin, HIGH);
  spi->endTransaction();
  Serial.print("Reçu:");  Serial.print(dataIn, HEX);
  Serial.print("\t"); Serial.print(dataIn1, HEX);
  Serial.print("\t Lecture="); Serial.println(lecture, HEX);
  return lecture; // adc.toAnalog(lecture);
}

J'obtiens l'affichage suivant :

Reçu:EF C0    Lecture=F0

J'ai l'impression qu'il me manque 8 bits à l'affichage.
Merci pour votre aide

faut décaler de 8 pas 4

Exact, merci.
Par contre j'aimerais qu'il m'affiche mes 16 bits même s'ils sont à 0.
et je m'en serai aperçu

La solution la plus simple, je pense, est avec sprinf :

  char buffer[8];
  sprintf(buffer, "0x%04X", value);
  Serial.println(buffer);

Certains processeurs (comme les ESP32) semblent accepter

Serial.printf("value is %.*s\n", n, value); //ESP32

(Voir Sprintf - conversion specifications (%n$))

hello, à tester

long valeur = 0x0F0CF0A0;
void setup() {
  Serial.begin(115200);
  Serial.println(" ");
  print_binaire(valeur);
}

void loop() {
  // put your main code here, to run repeatedly:

}
void print_binaire(long val)
{
  for (int S = sizeof(val); S > 0; S--)
  {
    for (int f = ((8 * S) - 1); f >= ((8 * (S - 1))); f--)
    {
      if (bitRead(val, f) == 0) {
        Serial.print("0");
      } else {
        Serial.print("1");
      }
    }
    Serial.print(" ");
  }
}

@Etienne_74 : j'ai testé ton code, mais il affiche la valeur en HEXA :woozy_face:

Je pense que c'est ce que veut Mg31416 mais il suffit de remplacer le (dernier) X de "0x%04X" par 'd' pour afficher en décimal.

Comme dans ce tuto

EDIT : il faut plutôt remplacer "0x%04X" par "%05u" car c'est une valeur non signée 16 bit donc sur 5 digits mais pas précédée de 0x bien sûr...

EDIT2 : @dfgh : Je viens de lire ton code et de comprendre que tu voulais afficher en binaire : pas de solution toute faite pour le binaire à ma connaissance... donc, oui, il faut le faire "à la main"

Merci à vous deux pour vos conseils éclairés, je vais essayer demain