ai miei tempi
mi pare che sommavo in basic 32 al minuscolo per ottenere il maiuscolo,
No si sommava 32 per passare da maiuscolo a minuscolo, oppure l'inverso cioè si sottraeva 32 per passare da minuscolo a maiuscolo. Questo perché A=65, a=97

Tornando al tuo problema, tu devi fare la conversione di un dato esadecimale in decimale. Se ad esempio ti arriva E2 devi convertirlo in 226, ma non puoi farlo come pensi tu. Cioè la conversione da esadecimale a decimale si fa con
(valore del 1° carattere*16)+valore del 2° carattere.
Quindi E*16+2 -> 14*16+2 -> 224+2 = 226
Io allora farei così
char carattere;
byte contatore=2;
byte risultato=0;
while (contatore) { //loop finché non sono arrivati 2 cifre
if (Serial.available()) {
carattere=Serial.read();
if ((carattere>='0') && (carattere<='9')) { //cifra numerica
contatore--;
risultato+=(carattere*(contatore>0?16:1)); //sommo il valore esadecimale
} else if ((carattere>='A') && (carattere<='F')) { //
contatore--;
risultato+=(carattere-55)*(contatore>0?16:1); //A=65 -> 65-55=10 ecc..
} else if ((carattere>='a') && (carattere<='f')) {
contatore--;
risultato+=(carattere-87)*(contatore>0?16:1); //a=97 -> 97-87=10 ec...
}
}
}
In questo modo dovrebbe funzionare. Dovrebbe leggere 2 cifre, e continuare a leggere finché il carattere ricevuto non ricade nell'intervallo 0-9, oppure A-F oppure a-f. "contatore" serve per eseguire il ciclo solo 2 volte (2 cifre), viene anche usato per la conversione in questo modo: all'avvio vale 2, se si riceve un carattere valido, passa a 1, poi viene moltiplicato per 16 ed il risultato moltiplicato per il valore ricevuto. Vien da sé che l'operatore condizionale su contatore quando vale 1 dia 16 mentre quando vale 0 (caso della seconda cifra), dia come risultato 1.
Non so nemmeno se compila, l'ho scritta di getto