Auf der einfachsten Ebene kann man sagen, dass ein einfaches Kommunikationsprotokoll drei Ebenen aufweist: physisch, Transport und Anwendung. (Es gibt Modelle mit mehr als OSI mit 7 oder TCP / IP mit 4. Die Anzahl der Schichten ist im Zusammenhang mit dieser Frage nicht besonders wichtig.)
Die Anwendungsebene ist die Ebene, mit der Sie sich direkt in Ihrem Code befassen, und der Fokus der Frage. Für die Transportschicht ist das Byte, das Sie in send_data an sie übergeben haben, nur ein binäres Muster. Sie können es jedoch in Ihrem Anwendungscode als den Buchstaben "A" interpretieren. Die CRC- oder Prüfsummenberechnung ist dieselbe, unabhängig davon, ob Sie das Byte als 'A', '0x41' oder '0b01000001' betrachten.
Die Transportschicht ist die Paketebene, auf der sich Ihre Nachrichtenköpfe befinden, und die Fehlerprüfung, ob es sich um eine CRC-Datei oder eine einfache Prüfsumme handelt. Im Zusammenhang mit Firmware haben Sie möglicherweise eine Funktion wie send_data, bei der Sie ein zu sendendes Byte übergeben. Innerhalb dieser Funktion wird es in ein Paket geschrieben, das sagt: "Hey, das ist eine normale Nachricht, erfordert eine Bestätigung, und die Prüfsumme ist 0x47, die aktuelle Zeit ist X." Dieses Paket wird über die physikalische Schicht an den empfangenden Knoten gesendet.
Auf der physischen Schicht werden die Elektronik und die Schnittstelle definiert: Anschlüsse, Spannungspegel, Timing usw. Diese Schicht kann von einigen Spuren reichen, auf denen TTL-Signale für einen Basis-UART auf einer Leiterplatte ausgeführt werden, bis zu einem vollständig isolierten differentiellen Paar, wie in einigen CAN- Implementierungen.
Auf dem empfangenden Knoten kommt das Paket auf der physischen Schicht an, wird auf der Transportschicht entpackt und dann steht Ihr Binärmuster der Anwendungsschicht zur Verfügung. Die Ebene der empfangenden Knotenanwendung muss wissen, ob dieses Muster als "A", "0x41" oder "0b01000001" interpretiert werden soll und was damit zu tun ist.
Zusammenfassend ist es so gut wie immer akzeptabel, ASCII-Zeichen zu senden, wenn die Anwendung dies erfordert. Das Wichtigste ist, Ihr Kommunikationsschema zu verstehen und einen Fehlerprüfungsmechanismus einzuschließen.