码迷,mamicode.com
首页 > 其他好文 > 详细

蓝牙收发数据过大需要分包-组包处理

时间:2015-04-23 17:34:04      阅读:392      评论:0      收藏:0      [点我收藏+]

标签:

{
				static unsigned char Bt_RxData_Merge_Status=Bt_RxData_Merge_Defaul_Status;
				
				 //意思是一个iAP数据包被一个Bt_RxData发送
				if(Bt_RxData_Merge_Status==Bt_RxData_Merge_Defaul_Status && 0x55==Bt_RxData->MsgData[2])
				{
					//首先检测iAP数据包的长度
					//iAP数据包:Length域数据包含1或3字节,这取决于载荷的长度
					//一字节域可在单字节中表现0x02到0xFC (2到252)的载荷长度
					//三字节域数据包含0x00标记字节,2字节载荷长度域值紧随其后,范围从0x00FD到0xFFFA (253到65529)。
					 if (0x00 != Bt_RxData->MsgData[3]) //iAP 的Length为单字节
					{

						//解析iAP数据
						Bt_iAP_CmdList_TypeDef * iap_data =(Bt_iAP_CmdList_TypeDef *)malloc(sizeof(Bt_iAP_CmdList_TypeDef));
						if(iap_data==NULL)
						{
							return ;
						}
						memset(iap_data, 0, sizeof(Bt_iAP_CmdList_TypeDef));

						iap_data->len = Bt_RxData->MsgData[3];
						iap_data->lingo_id = Bt_RxData->MsgData[4];
						iap_data->command_id = Bt_RxData->MsgData[5];
						iap_data->trans_id = (Bt_RxData->MsgData[6] << 8) | (Bt_RxData->MsgData[7] & 0xff);
						//Bt_RxData->MsgLength=start+len+lingo_id+command_id+trans_id+checksum+paybuf
						memcpy(iap_data->rece_buf, &(Bt_RxData->MsgData[8]), Bt_RxData->MsgData[1]-7);

						//把一个完整的iAP数据插入链表
						Bt_IapCommand_CmdListInsertCmd(iap_data);
			
						//iAP认证通过之后开始处理EA通道
						if(GetCurBtIapAuthenticatedStatus()==BT_IAP_SUCCESS)
						{
							iap_packet_deal();
						}

						//重新设置Bt_RxData_Merge_Status标志位
						Bt_RxData_Merge_Status=Bt_RxData_Merge_Defaul_Status;
					

					}
				       else if(0x00==Bt_RxData->MsgData[3]) //iAP 的Length为三字节,并且是以0x00开头为标记,后面两个字节是iAP的长度,很明显是大于Bt_RxData的最大长度256,需要分包处理
					{
						iAP_point = 0;
						memset(iAP_PayLoadBuf, 0, MAX_IAP_DATA_BUFFER);
						
						//Bt_RxData->MsgData[1]=start+len+lingo_id+command_id+trans_id+checksum+PayBuf
						//0x99 开头后面接着用户数据长度
						//保存iap数据包的长度
						iap_data_len= (Bt_RxData->MsgData[4] << 8) | (Bt_RxData->MsgData[5]  & 0xff);
						
						memcpy(iAP_PayLoadBuf + iAP_point, &(Bt_RxData->MsgData[2]), Bt_RxData->MsgData[1]);
						iAP_point=iAP_point+Bt_RxData->MsgData[1];

						//重新设置Bt_RxData_Merge_Status标志位需要分包处理
						Bt_RxData_Merge_Status=Bt_RxData_Merge_Middle_Status;


					}
				}
				else if(Bt_RxData_Merge_Status==Bt_RxData_Merge_Middle_Status)
				{
						memcpy(iAP_PayLoadBuf + iAP_point, &(Bt_RxData->MsgData[2]), Bt_RxData->MsgData[1]);
						iAP_point=iAP_point+Bt_RxData->MsgData[1];

						//比较缓存的数据是否已经可以组成一个完整的iAP数据包
						if((iAP_point-5)>=iap_data_len)
						{
							//iAP_point=iap_data_len+sizeof(start)+sizeof(len)+sizeof(checksum)=iap_data_len+5
							//解析iAP数据
							Bt_iAP_CmdList_TypeDef * iap_data =(Bt_iAP_CmdList_TypeDef *)malloc(sizeof(Bt_iAP_CmdList_TypeDef));
							if(iap_data==NULL)
							{
								return ;
							}
							memset(iap_data, 0, sizeof(Bt_iAP_CmdList_TypeDef));

							iap_data->len = (iAP_PayLoadBuf[2] << 8) | (iAP_PayLoadBuf[3]  & 0xff);
							iap_data->lingo_id =iAP_PayLoadBuf[4];
							iap_data->command_id = iAP_PayLoadBuf[5];
							iap_data->trans_id = (iAP_PayLoadBuf[6] << 8) | (iAP_PayLoadBuf[7] & 0xff);
							//Bt_RxData->MsgLength=start+len+lingo_id+command_id+trans_id+checksum+paybuf
							memcpy(iap_data->rece_buf, &(iAP_PayLoadBuf[8]), iAP_point-9);

							//把一个完整的iAP数据插入链表
							Bt_IapCommand_CmdListInsertCmd(iap_data);
				
							//iAP认证通过之后开始处理EA通道
							if(GetCurBtIapAuthenticatedStatus()==BT_IAP_SUCCESS)
							{
								iap_packet_deal();
							}

							//重新设置Bt_RxData_Merge_Status标志位为初始化状态
							Bt_RxData_Merge_Status=Bt_RxData_Merge_Defaul_Status;
						}
						else if((iAP_point-5)<iap_data_len)
						{
							//重新设置Bt_RxData_Merge_Status标志位需要分包处理
							Bt_RxData_Merge_Status=Bt_RxData_Merge_Middle_Status;

							//组包处理计数
							iAP_Merge_test++;

						}

				

				}
				
			}

蓝牙收发数据过大需要分包-组包处理

标签:

原文地址:http://blog.csdn.net/cao527121128/article/details/45223171

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!