Ở cấp độ đơn giản nhất, bạn có thể nói một giao thức giao tiếp đơn giản có ba lớp: vật lý, vận chuyển và ứng dụng. (Có những mô hình có nhiều hơn như OSI với 7 hoặc TCP / IP với 4. Số lớp không quá quan trọng trong bối cảnh của câu hỏi này.)
Lớp ứng dụng là lớp bạn xử lý trực tiếp trong mã của bạn và là trọng tâm của câu hỏi. Đối với lớp vận chuyển có liên quan, byte bạn truyền cho nó trong send_data chỉ là một mẫu nhị phân, nhưng bạn có thể hiểu nó trong mã ứng dụng của bạn là chữ 'A'. Tính toán CRC hoặc tổng kiểm tra sẽ giống nhau bất kể bạn coi byte là 'A,' 0x41 hay 0b01000001.
Tầng giao vận là cấp gói, nơi bạn có các tiêu đề thư và kiểm tra lỗi, cho dù đó là CRC hay tổng kiểm tra cơ bản. Trong ngữ cảnh của phần sụn, bạn có thể có một hàm như send_data, nơi bạn truyền cho nó một byte để gửi. Bên trong chức năng đó, nó đặt vào một gói có nội dung: "Này đây là một tin nhắn bình thường, yêu cầu xác nhận và tổng kiểm tra là 0x47, thời gian hiện tại là X." Gói này được gửi qua lớp vật lý đến nút nhận.
Lớp vật lý là nơi xác định giao diện và thiết bị điện tử: đầu nối, cấp điện áp, thời gian, v.v ... Lớp này có thể bao gồm từ một vài dấu vết chạy tín hiệu TTL cho UART cơ bản trên PCB, đến cặp vi sai cách ly hoàn toàn như trong một số CÓ THỂ thực hiện.
Tại nút nhận, gói đến trong lớp vật lý, được giải nén ở lớp vận chuyển và sau đó mẫu nhị phân của bạn có sẵn cho lớp ứng dụng. Tùy thuộc vào lớp ứng dụng nút nhận để biết liệu mẫu đó nên được hiểu là 'A,' 0x41 hay 0b01000001 và phải làm gì với nó.
Tóm lại, việc gửi các ký tự ASCII khá dễ chấp nhận nếu đó là những gì ứng dụng yêu cầu. Điều quan trọng là phải hiểu sơ đồ liên lạc của bạn và bao gồm cơ chế kiểm tra lỗi.