Allora, per spiegarti meglio rielaboro la mia affermazione completandola con le parti volutamente tralasciate:
Se scrivi Serial.write(65) l'Arduino ti spedisce un dato di tipo byte contenente il valore 65
La seriale spedisce singoli bit ma il tipo di dati più semplice che tratta è il tipo byte. Un byte è un dato ad 8 bit che può contenere un valore numerico che varia da 0 a 255. L'arduino ha un buffer seriale che altro non è che un array di byte. Per spedire un byte, io uso Serial.write, che mi inserisce il byte nel buffer, dal quale poi viene prelevato e spedito sulla seriale. Chiaro, no? Adesso affrontiamo il problema sulla ricezione.
In ricezione si opera sempre a livello di byte: se spedisco un byte, spedisco e ricevo 8 bit. Alla ricezione se inserisco il valore in una variabile di tipo byte, utilizzerò il suo valore numerico. Posso però usare anche il tipo char. Il tipo char è particolare perché nell'ANSI C rappresenta un carattere stampabile. Quindi un carattere rappresentato dal codice ASCII del valore memorizzato. Quindi se il valore 65 lo memorizzo in un byte, avrò solo il "numero" 65. Se lo memorizzo in un char, lo potrò considerare sia come valore (es.: char a=65) sia come carattere (es.: char a='A').
La notazione decimale non cambia la carte in regola ma è solo un modo differente per indicare al compilatore il valore da memorizzare. Così vale per il binario. Insomma, 0x41 = 0b01000001 = 65