标签:
{ 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