stm32f4系列tcp传输例程问题,分包传输掉数据

2019-07-21 00:16发布



请教下开发板的数据传输问题。现在跑的例程是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); //&#189;&#171;òa·¢&#203;íμ&#196;êy&#190;Y&#188;óè&#235;μ&#189;·¢&#203;í&#187;o3&#229;&#182;óáD&#214;D

                if(wr_err==ERR_OK)
                {  
                        es->p=ptr->next;                        //&#214;&#184;&#207;ò&#207;&#194;ò&#187;&#184;&#246;pbuf
                        if(es->p)pbuf_ref(es->p);        //pbufμ&#196;ref&#188;óò&#187;
                        pbuf_free(ptr);                                //êí·&#197;ptr
                }
                else if(wr_err==ERR_MEM) {
                        es->p=ptr;
                }
                tcp_output(tpcb);                //&#189;&#171;·¢&#203;í&#187;o3&#229;&#182;óáD&#214;Dμ&#196;êy&#190;Yá¢&#188;′·¢&#203;í3&#246;è¥
        }        
}


另外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);//·¢&#203;íêy&#190;Y
        return ERR_OK;
}


现在出现的情况是,大部分情况下工作稳定,但是少数情况下上位机会丢失几个段,比如data_tcp_send里面分了15段来发送,结果上位机仅收12段,其余丢失。另外在data_tcp_send函数中,我们必须加delay_ms(3); 3ms以上的时间才能正常工作,因为tcp_client_senddata里面已经有了tcp_output,不清楚为什么必须延时,而这个延时明显影响了传输速度。我们测试的结果是延时越长越稳定,出错的几率越小。不知道对于发送大数据的情况,使用netcon接口的形式会更稳定吗?





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。