En el nivel más simple, se podría decir que un protocolo de comunicación simple tiene tres capas: física, transporte y aplicación. (Hay modelos con más como OSI con 7 o TCP / IP con 4. El número de capas no es terriblemente importante en el contexto de esta pregunta.)
La capa de aplicación es la capa con la que trata directamente en su código y el enfoque de la pregunta. En lo que respecta a la capa de transporte, el byte que le pasaste en send_data es solo un patrón binario, pero puedes interpretarlo en el código de tu aplicación como la letra 'A'. El cálculo de CRC o suma de comprobación será el mismo independientemente de si considera que el byte es 'A', 0x41 o 0b01000001.
La capa de transporte es el nivel de paquete, donde tiene los encabezados de sus mensajes y la comprobación de errores, ya sea CRC o una suma de comprobación básica. En el contexto del firmware, puede tener una función como send_data, donde le pasa un byte para enviar. Dentro de esa función, se coloca en un paquete que dice: "Oye, este es un mensaje normal, requiere un acuse de recibo y la suma de comprobación es 0x47, la hora actual es X". Este paquete se envía a través de la capa física al nodo receptor.
La capa física es donde se definen la electrónica y la interfaz: conectores, niveles de voltaje, temporización, etc. Esta capa puede abarcar desde un par de trazas que ejecutan señales TTL para un UART básico en una PCB, hasta un par diferencial completamente aislado. como en algunas implementaciones de CAN .
En el nodo receptor, el paquete entra en la capa física, se desempaqueta en la capa de transporte y, a continuación, su patrón binario está disponible para la capa de aplicación. Depende de la capa de aplicación del nodo receptor saber si ese patrón debe interpretarse como 'A,' 0x41 o 0b01000001, y qué hacer con él.
En conclusión, es casi siempre aceptable enviar caracteres ASCII si eso es lo que requiere la aplicación. Lo importante es comprender su esquema de comunicación e incluir un mecanismo de comprobación de errores.