思考:
BLE一次最大隻能傳輸20字節,則怎樣把大數據拆分成一包一包的20字節進行傳輸呢?
1. 數據分幀
1) 第一幀
按照自己的規定拆分,如規定第一包數據前4個字節作爲標識,可以是包頭,包序號,幀序號,包有效數據長度等,按照需求規定,那後面的16個字節自然是填入真正的有效數據。最後把這整包數據存入待發送的數組緩存一下。
2) 第二幀,第二針數據前幾個字節可以不用規定的那麼多,比如可以只規定第1節爲幀序號,標識這是第幾幀數據啦,第2字節可以標識數據長度,後面的18個字節自然是填入有效的數據。分好過後,按照第一幀的方式把數據存到數組緩存一下。
3) 第3..n幀都依次按照以上2中所述,存到數組緩存中,打包數據。
4) 最後一幀,以上可以通過for循環的方式把打好包的數據依次減掉。最後判斷出數據爲最後一幀時,打包好數據,開始發送數據。
2. 數據發送
這裏牽扯到BLE的notify/indicate的使用上,當BLE發送一幀數據時,會拋出一個事件,則此時可以在該事件中寫一個方法查看你的數據分幀中數組緩存中還有沒有數據了。如果有,繼續調用發送數據函數。數據結構以及數組如何定義,且看下文。
3. 數據接收,按照同樣方法,當查找到最後一幀數據,即表示數據接收完畢,按照規定的格式,取出數據即可。
4. 數據結構
直接舉個實例,比如定義以下結構體
Typedef struct
{
Uint8_t rd;
Uint8_t wr;
Struct qpp_data_tag qpp_data_buf;
}proc_qpp_data;
Struct qpp_data_buf
{
Uint8_tdata_buf_len[10];
Uint8_tdata_buf[10][20];//具體使用可根據需求用宏定義代替數字,便於移植
};
以上結構體加數據,在我的數據透傳中的思想如下:
Wr:用來標識包,比如在數據分幀中,分完一包,即把wr加1,。
rd:用來標識打包後的數據,發送的標識,比如發送了第一幀,則rd加1,再發第二幀。
data_buf_len:可以用來記錄此次打包的數據長度,如第一幀,去掉前面4字節,那麼後面只能夠填16個字節。第二針,只能填18個字節等等。
data_buf:就是分包的數據所存放的地方啦。二維數組的好處在於,分包過程,像是一支毛筆,在白紙上一行一行的劃數據。而又可以通過wr來記錄劃到了第幾行。最後再通發送數據拋出的事件中,通過比較wr與rd兩值是否相等,來確定緩存中還是否存在數據,繼而決定是否繼續發送。