OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4157|回复: 4

求助一个关于Lwip收发的问题

[复制链接]

5

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-1-10
在线时间
19 小时
发表于 2017-5-3 13:52:52 | 显示全部楼层 |阅读模式
10金钱
移植了原子哥的ENC28J60+LWIP的裸机TCP客户端程序,基本功能都是正常的,但是在连续收发会有丢消息的现象 原程序应答式样测试.jpg

[mw_shl_code=c,true]//lwIP tcp_pollμÄ»Øμ÷oˉêy
err_t tcp_client_poll(void *arg, struct tcp_pcb *tpcb)
{
        err_t ret_err;
        struct tcp_client_struct *es;
        es=(struct tcp_client_struct*)arg;
        if(es!=NULL)  //ᬽó′|óú¿ÕÏD¿éòÔ·¢Ëíêy¾Y
        {
                if(tcp_client_flag&(1<<7))        //&#197;D&#182;&#207;ê&#199;·&#241;óDêy&#190;Yòa·¢&#203;í
                {
                        es->p=pbuf_alloc(PBUF_TRANSPORT, strlen((char*)tcp_client_sendbuf),PBUF_POOL);        //éê&#199;&#235;&#196;ú′&#230;
                        pbuf_take(es->p,(char*)tcp_client_sendbuf,strlen((char*)tcp_client_sendbuf));        //&#189;&#171;tcp_client_sentbuf[]&#214;Dμ&#196;êy&#190;Y&#191;&#189;±′μ&#189;es->p_tx&#214;D
                        sendNum+=1;       
                        tcp_client_senddata(tpcb,es);//&#189;&#171;tcp_client_sentbuf[]à&#239;&#195;&#230;&#184;′&#214;&#198;&#184;&#248;pbufμ&#196;êy&#190;Y·¢&#203;í3&#246;è¥
                        tcp_client_flag&=~(1<<7);        //&#199;&#229;3yêy&#190;Y·¢&#203;í±ê&#214;&#190;
                        if(es->p)pbuf_free(es->p);        //êí·&#197;&#196;ú′&#230;
                }else if(es->state==ES_TCPCLIENT_CLOSING)
                {
                        tcp_client_connection_close(tpcb,es);//1&#216;±&#213;TCPá&#172;&#189;ó
                }
                ret_err=ERR_OK;
        }else
        {
                tcp_abort(tpcb);//&#214;&#213;&#214;1á&#172;&#189;ó,é&#190;3ypcb&#191;&#216;&#214;&#198;&#191;é
                ret_err=ERR_ABRT;
        }
        return ret_err;
}
//lwIP tcp_sentμ&#196;&#187;&#216;μ÷oˉêy(μ±′ó&#212;&#182;&#182;&#203;&#214;÷&#187;ú&#189;óê&#213;μ&#189;ACKD&#197;o&#197;oó·¢&#203;íêy&#190;Y)
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)
        {
                sendNum+=1;       
                tcp_client_senddata(tpcb,es);//·¢&#203;íêy&#190;Y
        }
        return ERR_OK;
}[/mw_shl_code]

[mw_shl_code=c,true]                if(tcp_client_flag&1<<6)//ê&#199;·&#241;ê&#213;μ&#189;êy&#190;Y?
                {
                        receNum+=1;
                        printf("%s\r\n",tcp_client_recvbuf);
                        tcp_client_flag&=~(1<<6);//±ê&#188;&#199;êy&#190;Yò&#209;&#190;-±&#187;′|àíá&#203;.
                        tcp_client_flag|=1<<7;//±ê&#188;&#199;òa·¢&#203;íêy&#190;Y                       
                }[/mw_shl_code]

RECENUM和SENDNUM还有返回消息分别是在上面代码实现的;
TCP Server发送一次是6字节,所以应该是发送了418字节,接受一次是9字节,所以应该接受了415次,这样和统计出来的数字之间就有了出入;
是这样的统计方式不准确还是确实有消息丢失了?求指教


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-1-10
在线时间
19 小时
 楼主| 发表于 2017-5-3 14:58:20 | 显示全部楼层
回复

使用道具 举报

5

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-1-10
在线时间
19 小时
 楼主| 发表于 2017-5-4 15:08:27 | 显示全部楼层
附上工程文件

网络实验4 RAW_TCP客户端实验.zip

1.11 MB, 下载次数: 51

回复

使用道具 举报

5

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-1-10
在线时间
19 小时
 楼主| 发表于 2017-5-4 15:11:45 | 显示全部楼层
[mw_shl_code=c,true]void ENC28J60_ISRHandler(void)
{
        u8 status;
        u8 packetnum;
        u16 temp;
        ENC28J60_Write_Op(ENC28J60_BIT_FIELD_CLR,EIE,EIE_INTIE);        //1&#216;±&#213;ENC28J60μ&#196;è&#171;&#190;&#214;&#214;D&#182;&#207;
        status=ENC28J60_Read(EIR);        //&#182;áè&#161;ò&#212;ì&#171;í&#248;&#214;D&#182;&#207;±ê&#214;&#190;&#188;&#196;′&#230;&#198;÷
        if(status&EIR_PKTIF)                //&#189;óê&#213;μ&#189;êy&#190;Y,′|àíêy&#190;Y
        {
                ENC28J60_Write_Op(ENC28J60_BIT_FIELD_CLR,EIR,EIR_PKTIF);        //&#199;&#229;3yENC28J60μ&#196;&#189;óê&#213;&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
                lwip_pkt_handle() ;
        }
        if(status&EIR_TXIF)                        //ò&#212;ì&#171;í&#248;·¢&#203;í&#214;D&#182;&#207;
        {
                ENC28J60_Write_Op(ENC28J60_BIT_FIELD_CLR,EIR,EIR_TXIF);        //&#199;&#229;3yENC28J60μ&#196;&#189;óê&#213;&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
               
        }
        if(status&EIR_RXERIF)                //&#189;óê&#213;′í&#206;ó&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
        {
                ENC28J60_Write_Op(ENC28J60_BIT_FIELD_CLR,EIR,EIR_RXERIF);       
                packetnum=ENC28J60_Read(EPKTCNT);
                temp=ENC28J60_Read(ERXRDPTH)<<8;                //&#182;áè&#161;&#184;&#223;×&#214;&#189;ú
                temp|=ENC28J60_Read(ERXRDPTL);                        //&#182;áè&#161;μí×&#214;&#189;ú
                temp++;
                ENC28J60_Write(ERXRDPTL,temp&0XFF);                //&#207;èD′è&#235;μí×&#214;&#189;ú
                ENC28J60_Write(ERXRDPTH,temp>>8);                //&#207;èD′è&#235;μí×&#214;&#189;ú
                ENC28J60_Write_Op(ENC28J60_BIT_FIELD_SET,ECON2,ECON2_PKTDEC);
                printf("&#189;óê&#213;′í&#206;ó£&#161;&#189;óê&#213;μ&#189;êy&#190;Y°ü&#184;&#246;êy:%d\r\n",packetnum);
        }
        if(status&EIR_TXERIF)                //·¢&#203;í′í&#206;ó&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
        {
                ENC28J60_Write_Op(ENC28J60_BIT_FIELD_CLR,EIR,EIR_TXERIF);
                ENC28J60_Write_Op(ENC28J60_BIT_FIELD_CLR,ESTAT,ESTAT_LATECOL|ESTAT_TXABRT);
                printf("·¢&#203;í′í&#206;ó!\r\n");
        }
        ENC28J60_Write_Op(ENC28J60_BIT_FIELD_SET,EIE,EIE_INTIE);        //′ò&#191;aENC28J60μ&#196;è&#171;&#190;&#214;&#214;D&#182;&#207;
}

//ía2&#191;&#214;D&#182;&#207;&#207;&#223;1μ&#196;&#214;D&#182;&#207;·t&#206;&#241;oˉêy
void EXTI4_IRQHandler(void)
{
        EXTI_ClearITPendingBit(EXTI_Line4); //&#199;&#229;3y&#214;D&#182;&#207;&#207;&#223;41ò&#198;e±ê&#214;&#190;&#206;&#187;
        while(ENC28J60_INT == 0)
        {
                ENC28J60_ISRHandler();
        }                                                                                 
}[/mw_shl_code]
现在比较怀疑是中断这里的问题,接受数据时是关闭中断的,这样在读取数据的过程中有数据发过来是不是可能就会丢失呢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165426
金钱
165426
注册时间
2010-12-1
在线时间
2113 小时
发表于 2017-5-4 19:17:59 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-9 02:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表