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