请教下开发板的数据传输问题。现在跑的例程是raw版本的tcp_client例程,但是在发送大包数据的时候出现丢包的情况。由于传入的data数据量比较大,因此采用了分包发送的函数:
// 这个写法是否正确?
void bigdata_tcp_send(void *arg, struct tcp_pcb *tpcb, u8 *data, u32 len)
{
struct tcp_client_struct *es;
u32 remsize=len;
u8 offset_blk=0;
u32 package_size=1024; // 这里我们也试过tcp_sndbuf,结果类似。
// printf("send %d bytes data to PC
",remsize);
es=(struct tcp_client_struct *)arg;
while(remsize)
{
if(remsize<=package_size)
{
es->p=pbuf_alloc(PBUF_TRANSPORT,remsize,PBUF_POOL);
pbuf_take(es->p,data+offset_blk*package_size,remsize);
tcp_client_senddata(tpcb,es);
if(es->p!=NULL) pbuf_free(es->p);
remsize=0;
}
else
{
es->p=pbuf_alloc(PBUF_TRANSPORT,package_size,PBUF_POOL);
pbuf_take(es->p,data+offset_blk*package_size,package_size);
tcp_client_senddata(tpcb,es);
if(es->p!=NULL) pbuf_free(es->p);
offset_blk++;
remsize-=package_size;
}
// tcp_output(tpcb);
delay_ms(3);
// wait for empty of es->p
while(es->p) {
}
}
return;
}
里面senddata函数还是默认的:
void tcp_client_senddata(struct tcp_pcb *tpcb, struct tcp_client_struct * es)
{
struct pbuf *ptr;
err_t wr_err=ERR_OK;
while((wr_err==ERR_OK)&&es->p&&(es->p->len<=tcp_sndbuf(tpcb)))
{
ptr=es->p;
wr_err=tcp_write(tpcb,ptr->payload,ptr->len,1); //½«òa·¢ËíμÄêy¾Y¼óèëμ½·¢Ëí»o3å¶óáDÖD
if(wr_err==ERR_OK)
{
es->p=ptr->next; //Ö¸ÏòÏÂò»¸öpbuf
if(es->p)pbuf_ref(es->p); //pbufμÄref¼óò»
pbuf_free(ptr); //êí·Åptr
}
else if(wr_err==ERR_MEM) {
es->p=ptr;
}
tcp_output(tpcb); //½«·¢Ëí»o3å¶óáDÖDμÄêy¾Yᢼ′·¢Ëí3öè¥
}
}
另外sent函数也默认如下:
err_t tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len)
{
struct tcp_client_struct *es;
LWIP_UNUSED_ARG(len);
es=(struct tcp_client_struct*)arg;
if(es->p)
tcp_client_senddata(tpcb,es);//·¢Ëíêy¾Y
return ERR_OK;
}
现在出现的情况是,大部分情况下工作稳定,但是少数情况下上位机会丢失几个段,比如data_tcp_send里面分了15段来发送,结果上位机仅收12段,其余丢失。另外在data_tcp_send函数中,我们必须加delay_ms(3); 3ms以上的时间才能正常工作,因为tcp_client_senddata里面已经有了tcp_output,不清楚为什么必须延时,而这个延时明显影响了传输速度。我们测试的结果是延时越长越稳定,出错的几率越小。不知道对于发送大数据的情况,使用netcon接口的形式会更稳定吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>