Ragazzi, fissate bene in testa quanto segue: qualunque cosa trasmettiate su qualunque mezzo digitale, quel che viaggia sono SEMPRE byte!
Senza pontificare troppo, un byte è un "piccolo numero intero" che può valere da 0 a 255, nulla di più, nulla di meno.
Se preferite dirlo in esadecimale (base 16), allora va da 0 a FF. Se preferite il binario (base 2), va da 0 a 11111111, ma è solo una questione di rappresentazione, il valore è sempre lo stesso. È un po' come parlare in italiano o in inglese, le parole sono diverse ma i concetti sono gli stessi.
Per comodità, nel seguito userò la rappresentazione decimale.
Ora, a meno che non si voglia trasmettere appunto una serie di tali piccoli numeri, bisogna in qualche modo trasformare quel che si vuole trasmettere in una sequenza di questi piccoli numeri. L'ASCII esiste apposta per questo, e assegna un "piccolo numero" ad ogni lettera dell'alfabeto e ad una serie di altri simboli utili. Ad esempio, la A maiuscola corrisponde a 65, la B a 66, ecc.
Tra i simboli che l'ASCII codifica, vi sono anche le cifre, ma le cifre intese come carattere, ovvero come simbolo, non come valore. Ad esempio, il simbolo che rappresenta il numero uno corrisponde a 49.
Ora, tu devi decidere se tra Python e Arduino vuoi spedire "piccoli numeri" o sequenze di caratteri che li rappresentano. È una tua scelta, con pro e contro: se devi spedire solo numeri < 255, un byte è sufficiente nel primo caso, mentre nel secondo ne possono servire fino a 3, visto che devi spedire la rappresentazione ASCII di ogni cifra. D'altro canto se devi spedire numeri arbitrariamente grandi, con un byte non lo puoi fare. Valuta tu, l'importante è che da un lato spedisci seguendo una rappresentazione, e dall'altra ricevi interpretandola correttamente,
PS: ord() è la funzione Python che, dato un carattere, restituisce il codice ASCII che gli corrisponde (per farla breve). chr() fa il contrario.