OpenEdv-开源电子网

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

lwip的客户端程序中在哪调用的发送接收函数

[复制链接]

12

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1887
金钱
1887
注册时间
2015-4-21
在线时间
102 小时
发表于 2016-1-8 16:54:45 | 显示全部楼层 |阅读模式
1金钱

在这个while循环中,是怎么调用tcp_client_senddata()和tcp_client_recv()发送接收数据的?是要等到创建一个新的pcb?
while(res==0)
        {
                key=KEY_Scan(0);
                if(key==WKUP_PRES)break;
                if(key==KEY0_PRES)//KEY0按下了,发送数据
                {
                        tcp_client_flag|=1<<7;//标记要发送数据
                }
                if(tcp_client_flag&1<<6)//是否收到数据?
                {
                        LCD_Fill(30,230,lcddev.width-1,lcddev.height-1,WHITE);//清上一次数据
                        LCD_ShowString(30,230,lcddev.width-30,lcddev.height-230,16,tcp_client_recvbuf);//显示接收到的数据tcp_client_recvbuf                       
                        tcp_client_flag&=~(1<<6);//标记数据已经被处理了.
                }
                if(tcp_client_flag&1<<5)//是否连接上?
                {
                        if(connflag==0)
                        {
                                LCD_ShowString(30,190,lcddev.width-30,lcddev.height-190,16,"STATUS:Connected   ");//提示消息               
                                POINT_COLOR=RED;
                                LCD_ShowString(30,210,lcddev.width-30,lcddev.height-190,16,"Receive Data:");//提示消息               
                                POINT_COLOR=BLUE;//蓝色字体
                                connflag=1;//标记连接了
                        }
                }else if(connflag)
                {
                        LCD_ShowString(30,190,190,16,16,"STATUSisconnected");
                        LCD_Fill(30,210,lcddev.width-1,lcddev.height-1,WHITE);//清屏
                        connflag=0;        //标记连接断开了
                }
                lwip_periodic_handle();
                delay_ms(2);
                t++;
                if(t==200)
                {
                        if(connflag==0&&(tcp_client_flag&1<<5)==0)//未连接上,则尝试重连
                        {
                                tcp_client_connection_close(tcppcb,0);//关闭连接
                                tcppcb=tcp_new();        //创建一个新的pcb
                                if(tcppcb)                        //创建成功
                                {
                                        tcp_connect(tcppcb,&rmtipaddr,TCP_CLIENT_PORT,tcp_client_connected);//连接到目的地址的指定端口上,当连接成功后回调tcp_client_connected()函数
                                }
                        }
                        t=0;
                        LED0=!LED0;
                }               
        }

最佳答案

查看完整内容[请看2#楼]

接收在中断函数void ETH_IRQHandler(void)中,发送在轮询void lwip_periodic_handle() 函数中的 tcp_tmr();中的tcp_slowtmr();里的TCP_EVENT_POLL(prev, err);函数,运行此函数时会进入void tcp_client_senddata()发送函数; 但tcp_client_senddata 与TCP_EVENT_POLL()是怎么关联的没看懂
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1887
金钱
1887
注册时间
2015-4-21
在线时间
102 小时
 楼主| 发表于 2016-1-8 16:54:46 | 显示全部楼层
接收在中断函数void ETH_IRQHandler(void)中,发送在轮询void lwip_periodic_handle() 函数中的 tcp_tmr();中的tcp_slowtmr();里的TCP_EVENT_POLL(prev, err);函数,运行此函数时会进入void tcp_client_senddata()发送函数;
但tcp_client_senddata 与TCP_EVENT_POLL()是怎么关联的没看懂
回复

使用道具 举报

19

主题

176

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1105
金钱
1105
注册时间
2015-10-27
在线时间
206 小时
发表于 2016-1-8 17:37:43 | 显示全部楼层
本帖最后由 dop101 于 2016-1-8 17:41 编辑

这里是tcp_client_sentbuf函数的调用,这个函数里面有调用了tcp_client_senddata(tpcb,es)
113250.png
回复

使用道具 举报

12

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1887
金钱
1887
注册时间
2015-4-21
在线时间
102 小时
 楼主| 发表于 2016-1-8 21:38:34 | 显示全部楼层
dop101 发表于 2016-1-8 17:37
这里是tcp_client_sentbuf函数的调用,这个函数里面有调用了tcp_client_senddata(tpcb,es)

我想知道,再上面tcp_client_test()这个while循环里,是怎么从哪里跳转出去进入tcp_client_poll()这个函数发数据的,是还有什么中断吗?我看到只有tcp_connect(tcppcb,&rmtipaddr,TCP_CLIENT_PORT,tcp_client_connected);这个函数可以进入发送数据的回调函数,在tcp_client_test()的while循环里没有找到其他进入发送函数的入口
回复

使用道具 举报

19

主题

176

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1105
金钱
1105
注册时间
2015-10-27
在线时间
206 小时
发表于 2016-1-11 11:45:25 | 显示全部楼层
tcp_client_test()里面的        tcppcb=tcp_new();        //创建一个新的pcb,tcp_new()在tcp.c下
struct tcp_pcb *
tcp_new(void)
{
  return tcp_alloc(TCP_PRIO_NORMAL);
}
从这里进去tcp_alloc
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2017-5-23
在线时间
26 小时
发表于 2021-3-23 19:49:09 | 显示全部楼层
楼主这块看懂了吗?我这两天学习网络通信这块,也没明白发送是怎么调用的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 15:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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