Có rất nhiều cách để viết một giao thức nối tiếp tùy thuộc vào chức năng bạn có thể muốn và mức độ kiểm tra lỗi bạn cần.
Một số điều phổ biến bạn thấy trong các giao thức điểm tới điểm là:
Kết thúc tin nhắn
Các giao thức ASCII đơn giản nhất chỉ có một kết thúc chuỗi ký tự thông báo, thường \r
hoặc \n
vì đây là những gì được in khi nhấn phím enter. Các giao thức nhị phân có thể sử dụng 0x03
hoặc một số byte phổ biến khác.
Bắt đầu tin nhắn
Vấn đề với việc chỉ có phần cuối của tin nhắn là bạn không biết những byte nào đã được nhận khi bạn gửi tin nhắn của mình. Các byte này sau đó sẽ được thêm tiền tố vào thông báo và khiến nó bị hiểu sai. Ví dụ, nếu Arduino vừa ngủ dậy, có thể có một số rác trong bộ đệm nối tiếp. Để giải quyết vấn đề này, bạn phải bắt đầu trình tự tin nhắn. Trong ví dụ của bạn ^
, trong các giao thức nhị phân thường0x02
Kiểm tra lỗi
Nếu tin nhắn có thể bị hỏng, chúng tôi cần kiểm tra lỗi. Đây có thể là tổng kiểm tra hoặc lỗi CRC hoặc một cái gì đó khác.
Nhân vật thoát
Có thể là tổng kiểm tra thêm vào một ký tự điều khiển, chẳng hạn như 'bắt đầu tin nhắn' hoặc 'cuối tin nhắn' hoặc tin nhắn chứa một giá trị bằng với một ký tự điều khiển. Giải pháp là giới thiệu một nhân vật thoát hiểm. Ký tự thoát được đặt trước ký tự điều khiển đã sửa đổi để không có ký tự điều khiển thực tế. Ví dụ: nếu một ký tự bắt đầu là 0x02, sử dụng ký tự thoát 0x10, chúng ta có thể gửi giá trị 0x02 trong tin nhắn dưới dạng cặp byte 0x10 0x12 (ký tự điều khiển XOR byte)
Số gói
Nếu một tin nhắn bị hỏng, chúng tôi có thể yêu cầu gửi lại bằng tin nhắn hoặc thử lại, nhưng nếu nhiều tin nhắn đã được gửi thì chỉ có thể gửi lại tin nhắn mới nhất. Thay vào đó, gói có thể được cung cấp một số cuộn qua sau một số lượng tin nhắn nhất định. Ví dụ: nếu số này là 16, thiết bị truyền có thể lưu 16 tin nhắn cuối cùng gửi và nếu có bị hỏng, thiết bị nhận có thể yêu cầu gửi lại bằng cách sử dụng số gói.
Chiều dài
Thông thường trong các giao thức nhị phân, bạn thấy một byte độ dài cho biết thiết bị nhận có bao nhiêu ký tự trong tin nhắn. Điều này thêm một mức kiểm tra lỗi khác như thể không nhận được số byte chính xác thì có lỗi.
Arduino cụ thể
Khi đưa ra một giao thức cho Arduino, việc xem xét đầu tiên là độ tin cậy của kênh truyền thông. Nếu bạn đang gửi qua hầu hết các phương tiện không dây, XBee, WiFi, v.v., đã có sẵn trong kiểm tra lỗi và thử lại và do đó không có điểm nào đưa các giao thức này vào giao thức của bạn. Nếu bạn đang gửi qua RS422 trong một vài km thì điều đó là cần thiết. Những điều tôi sẽ bao gồm là bắt đầu tin nhắn và kết thúc các ký tự tin nhắn, như bạn có. Triển khai điển hình của tôi trông giống như:
>messageType,data1,data2,…,dataN\n
Phân định các phần dữ liệu bằng dấu phẩy cho phép phân tích cú pháp dễ dàng và tin nhắn được gửi bằng ASCII. Các giao thức ASCII rất tuyệt vì bạn có thể nhập tin nhắn vào màn hình nối tiếp.
Nếu bạn muốn một giao thức nhị phân, có thể rút ngắn kích thước thông báo, bạn sẽ phải thực hiện thoát nếu một byte dữ liệu có thể giống như một byte điều khiển. Các ký tự điều khiển nhị phân tốt hơn cho các hệ thống trong đó toàn bộ kiểm tra lỗi và thử lại là mong muốn. Tải trọng vẫn có thể là ASCII nếu muốn.