思考:
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两值是否相等,来确定缓存中还是否存在数据,继而决定是否继续发送。