На простейшем уровне можно сказать, что простой протокол связи имеет три уровня: физический, транспортный и прикладной. (Есть модели с большим количеством, таких как OSI с 7 или TCP / IP с 4. Количество уровней не очень важно в контексте этого вопроса.)
Прикладной уровень - это уровень, с которым вы работаете непосредственно в своем коде, и фокус вопроса. Что касается транспортного уровня, то байт, который вы передали ему в send_data, является просто двоичным шаблоном, но вы можете интерпретировать его в коде приложения как букву «A». Расчет CRC или контрольной суммы будет одинаковым независимо от того, считаете ли вы, что байт равен «A», «0x41» или «0b01000001».
Транспортный уровень - это уровень пакета, где у вас есть заголовки сообщений и проверка ошибок, будь то CRC или базовая контрольная сумма. В контексте прошивки у вас может быть такая функция, как send_data, где вы передаете ей байт для отправки. Внутри этой функции она помещается в пакет, который говорит: «Эй, это нормальное сообщение, требуется подтверждение, контрольная сумма равна 0x47, текущее время - X». Этот пакет отправляется через физический уровень принимающему узлу.
На физическом уровне определяются электроника и интерфейс: разъемы, уровни напряжения, синхронизация и т. Д. Этот уровень может варьироваться от пары трассировок, запускающих сигналы TTL для базового UART на печатной плате, до полностью изолированной дифференциальной пары, как в некоторых CAN реализации.
На принимающем узле пакет поступает на физическом уровне, распаковывается на транспортном уровне, и затем ваш двоичный шаблон становится доступным для прикладного уровня. Прикладной уровень принимающего узла должен знать, должен ли этот шаблон интерпретироваться как «A», «0x41» или «0b01000001», и что с ним делать.
В заключение, почти всегда приемлемо посылать символы ASCII, если этого требует приложение. Важно понять вашу схему связи и включить механизм проверки ошибок.