OpenEdv-开源电子网

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

STM32F407+LWIP+ENC28J60中断方式实现数据接收

[复制链接]

16

主题

173

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2441
金钱
2441
注册时间
2014-11-5
在线时间
348 小时
发表于 2016-6-16 11:55:31 | 显示全部楼层 |阅读模式
demo是从xiaoyan大神的帖子http://www.openedv.com/thread-25178-1-1.html下代码移植过去的。demo(裸机)实现的功能如下:
实现了开发板作为客服端与远程服务器进行tcp/ip协议简单收发数据
实现DHCP动态分配IP功能
实现DNS功能
实现enc28j60采用中断方式接收网口的数据
实现简单判断网线是否插上


在此抛砖引玉,向前辈们请教几个问题。
以下代码中,有标志问题1和问题2。
1.问题1处,和服务器断开链接后,怎么还会收到空的数据帧?
2.err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)函数是客户端接收到数据后调用,那么和服务器断开链接后,假设问题1出程序程序能执行,但还能执行到问题2处吗?
3.自己的应用程序和LWIP内核回调程序是怎样一个运行流程?
4.怎样测试网络速度的快慢呢?
[mw_shl_code=c,true]//客户端接收到数据之后将要调用的函数
err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
                err_t ret_err;
                struct tcp_client_state* ts;
                ts = arg;                                            //TCP PCB状态
                if(p==NULL)                       //如果从服务器接收到空的数据帧就关闭连接,???问题1
                {       
                                ts->state = ES_CLOSING;                    //连接关闭了
                                tcp_client_close(tpcb,ts);
                                lwip_flag &=~ LWIP_CONNECTED;        //清除连接标志
                          printf("连接关闭了!1\r\n");
                       
                }
                else if(err!=ERR_OK)
                {        //位置错误释放pbuf
                                if(p!=NULL)
                                {
                                        pbuf_free(p);
                                }
                                ret_err = err;                            //得到错误
                }
                else if(ts->state==ES_RECEIVED)
                { //连接收到了新的数据
        revdatalen = p->tot_len;
                          if((p->tot_len)>=LWIP_DEMO_BUF)
                                {         //如果收的的数据大于缓存
                                        ((char*)p->payload)[LWIP_DEMO_BUF - 1] = 0;                
                                        memcpy(lwip_demo_buf,p->payload,LWIP_DEMO_BUF);
                                }
                                else
                                {                               
                                        memcpy(lwip_demo_buf,p->payload,p->tot_len);
                                        lwip_demo_buf[p->tot_len] = 0;                                       
                                }

                                lwip_flag |= LWIP_NEW_DATA;                //收到了新的数据
                          tcp_recved(tpcb, p->tot_len);                //用于获取接收数据的长度,        表示可以获取更多的数据                       
                                pbuf_free(p);        //释放内存
                                ret_err = ERR_OK;
                }
                else if(ts->state==ES_CLOSING) //???问题2
                {        //服务器关闭了
                                tcp_recved(tpcb, p->tot_len);                //远程端口关闭两次,垃圾数据
                                pbuf_free(p);
                          ret_err = ERR_OK;
                          printf("连接关闭了!2\r\n");
                }
                else
                {                                                                                //其他未知状态
                                tcp_recved(tpcb, p->tot_len);
                                pbuf_free(p);
                          ret_err = ERR_OK;
                }
                return ret_err;
}[/mw_shl_code]

STM32f4-LWIP Demo.zip

1.09 MB, 下载次数: 848

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 21:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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