BLE資料透傳的分幀思想
思考:
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兩值是否相等,來確定快取中還是否存在資料,繼而決定是否繼續傳送。