對于串口,我們知道不管是RS232還是RS485、RS422這些典型的串口标準通訊協議,隻是定義了部分物理層,對于數據鍊路層等基本沒有涉及,這也就體現了串口協議的靈活性,沒有統一的标準,需要使用者自己來定義合适的數據協議來傳輸自己的數據。
串口通訊的數據格式為:起始位(1bit)、數據位(7bit)、奇偶校驗位(1bit)、停止位(1bit)。
如圖:
數據格式
對于這個協議其實略顯的簡單了一點,具體體現在:
對于此,我們特意給出一種比較常用的簡單的數據幀形式。
1.幀起始
一般大家喜歡用0x55或者0xaa作為幀的起始位。我習慣用0x3C即"<"作為起始位。
2.命令域
主要要包含這幾類數據,如:上行為0x10,下行為0x30,重新傳輸為0x50,應答為0x70。
3.地址域
假如地址域用一個字節表示,基地址為0x20,每一個從節點的偏移地址為上一個從節點的偏移地址加0x20。
4.數據域
這個可根據自己的數據傳輸的需要,設定合适的字節數。
假如我的數據需要為:1byte的硬件版本号、1byte的軟件版本号、1byte的電池電量、10byte的動作數據。
那麼我定義的數據就是13字節了。
5.校驗域
常規使用CRC校驗。2個字節。
6.幀結束
我習慣使用0x3E即“>”。
對于一幀的數據,我習慣使用兩個連續的幀起始和幀結束,假如PC為主機,現在要從主機給從機偏移地址為0x04的設備傳輸一幀數據,數據格式即為:
<< 30 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >>
隻是列出了了一個格式,沒有具體的數據,也沒有做CRC。
這樣的數據格式基本就能有一些實用的價值了。
接下來我們來看一個實際的例子。
案例分享假如現在有一個藍牙主機和從機組成的無線網絡,藍牙從機是一塊手環,它具有檢測手部動作的功能,主機對應的是我們的目标設備,如我們家裡面的智能窗簾。我們預實現的功能有:
1.主設備給從設備發送的數據流包含的信息需有:
協議定義如下:
主機給從機發送指令(22字節),發送間隔不能小于800ms。
主機給從機發送數據的協議格式
其中:
指令信息對應關系如下
6 個字節的時間按十進制存儲 , 年月日時分秒各占一個字節, 其中年用(20000 1Byte) 來計
算, 其他直接用二進制直接轉化成十進制。
直觀列表如下:
協議列表
2.從設備給主設備發送的狀态數據流包含的信息需有:
協議定義如下:
從機給主機發送狀态數據(34字節),發送間隔2500ms。
從設備給主設備發送的狀态數據流
其中(主要):
電量信息:0X0-0X64(十進制 0-100), 代表設備電量的百分比。
工作狀态:
直觀列表如下:
協議列表
3.從機給主機發送的手勢控制信息包含的數據需有:
協議定義如下:
從機給主機發送手勢數據(共32字節 ),發送間隔20ms。
從機給主機發送的手勢數據協議格式
其中:
8 位數據是陀螺儀手勢數據
手勢數據
直觀列表如下:
協議列表
好了,到此我們隻要有了這一套協議,就可以完成一套簡單的手環控制的智能家居(窗簾)的動作了,後續就是具體程序的實現了。
這就是串口協議的特點,沒有規定數據鍊層,我們需要結合自己的項目完成數據格式的定義和數據的定義。
有了我這樣一套簡單的demo模塊,我相信簡單的串口協議的定義應該是沒有什麼問題了。
喜歡我文章的朋友,歡迎轉發、留言、評論。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!