
cpp
/*4.阻塞等待上位机(客户端)连接请求*/
if(netconn_accept(conn,&newconn)==ERR_OK){
/*5.循环处理接收到的数据*/
while((err=netconn_recv(newconn,&buf))==ERR_OK){//如果没有新的数据会进入阻塞态
do{
//从buf获取数据&data和len
netbuf_data(buf,&data,&len);//使用线性数组,不用循环数组 为什么?
memcpy(receiveBuffer+rc_count,data,len);//获取的数据拷贝给缓冲区
rc_count+=len;//rc_count是当前缓冲区字节数
/*用于遍历receiveBuffer[]缓冲区*/
while(((rc_count-1)-rc_header)>=15 ){//进入条件是:未处理数据>=16字节
uint32_t head=(receiveBuffer[rc_header]<<24|
receiveBuffer[rc_header+1]<<16|
receiveBuffer[rc_header+2]<<8|
receiveBuffer[rc_header]);
if(head==0xAA55AA55){//*(uint32_t*)(receiveBuffer+rc_header)uint32_t
if(CmdQueueHandle!=NULL){ // 访问通常期望地址能被 4 整除 如不能对其可能会进入HardFault
TCP_Message_t *pPkg=(TCP_Message_t *)(receiveBuffer+rc_header);
msg.depth_tar=pPkg->depth_tar;
msg.pitch_tar=pPkg->pitch_tar;
msg.roll_tar =pPkg->roll_tar;
xQueueSend(CmdQueueHandle,&msg,(TickType_t)0);
rc_count-=16;
/*滑动平移窗口*///缓冲区想象成一条传送带,处理了一个包,就应该把这个包及其前面的所有垃圾全部"剪掉",
memmove(receiveBuffer,receiveBuffer+rc_header+16,rc_count-rc_header-16); //把剩下的东西拉到最前面
rc_header=0;
}
}
else{
rc_header++;
}
}
}while(netbuf_next(buf)>=0);//跳转到下一个内存链表节点
netbuf_delete(buf);
}
/*客户端断开连接,清理资源*/
netconn_close(newconn);
netconn_delete(newconn);
}
osDelay(1);


为什么会粘包,分包?

