LwIP 的TCP连接无法同时收发问题请教。

2019-03-24 08:52发布

结构:LMS8962的板子跟PC连接,TCP协议,无操作系统。PC端程序是VC写的,测试都正常。
功能:板子向PC发送3个 unsigned int,PC向板子发送1个unsigned int
现象:单独写了板子向PC发送程序:板子正常发送,PC端正常接收到。
      单独写了板子接收PC发送字符的程序:板子正常接收,PC端正常发送。

问题:两个程序的功能合在一起后,必须板子先启动,然后运行PC程序,板子才能接收到数据。但板子始终无法发送数据,连自定义的发送回调函数都进不去。

下面是初始化代码。各位给指点下,这么写有问题没?

#define TCP_PORT_PMSM60 4000    // TCP port : 4000
void tcpclient_init()
{
  struct tcp_pcb *pcb;
  UARTprintf("tcpclient_init ");
  IP4_ADDR(&ipaddr, 119,78,208,24);  //Server PC IP address
  pcb = tcp_new();
  tcp_bind(pcb, IP_ADDR_ANY, TCP_PORT_PMSM60);
  pcb = tcp_listen(pcb);
  tcp_accept(pcb, tcp_acceptset);
  tcp_connect(pcb, &ipaddr, TCP_PORT_PMSM60, tcp_connected);
}

向看帖的筒子致敬!!!!! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
Study_Stellaris
1楼-- · 2019-03-25 08:19
 精彩回答 2  元偷偷看……
warcraftiii
2楼-- · 2019-03-25 10:37
感谢二位回复!

是想让板子做客户端。
板子发送是参考周立功“LwIP的RAW API接口及编程指南”的例子。
板子接收是参考斑竹帖子“以太网学习的一点心得”和TI的httpd的HTTP接收代码。
单独调试基本上都可以了,放在一起就不行。

回o0pingu0o
考虑到以后要用到长时间连接和数据刷新,选择了TCP。也正好PC上有个VC的TCP例子,呵呵!
周立功的代码我只有上面那个,其他哪里能找到?

回 Study_Stellaris:
pcb = tcp_listen(pcb);
tcp_accept(pcb, tcp_acceptset);
这两句是为了接收。如果板子做Client,接收数据的初始化代码该怎么写呢?
我理解tcp_listen(pcb)是把pcb放到监听队列里。
tcp_accept(pcb, tcp_acceptset)是为了在tcp_input()里调用“tcp_acceptset”这个回调函数。
至于这两句间的关系,从代码上没看懂。
发送和接收在一起的初始化流程该怎么写呢?
confuciounxk
3楼-- · 2019-03-25 15:59
板子作为客户端时,lwip TCP一般是这样的模式:
pcb = tcp_new();
tcp_bind(pcb,IP_ADDR_ANY,port);
tcp_poll(pcb,connectPoll,5);
tcp_connect(pcb,&IPAddr,port,callConnect);
端口的话要保证发送端口是你要发送的目标端口就行了!
Study_Stellaris
4楼-- · 2019-03-25 20:34
 精彩回答 2  元偷偷看……
warcraftiii
5楼-- · 2019-03-26 00:15
tcp_connect(pcb,&IPAddr,port,callConnect);里处理的是板子发送设置。
这个时候该怎么设置接收回调函数呢?
我改成下面的初始化设置,但还是不行,能发送,不能接收。
IP4_ADDR(&ipaddr, 119,78,208,24);  //Server PC IP address
pcb_send = tcp_new();
tcp_bind(pcb_send, IP_ADDR_ANY, 4000);
tcp_accept(pcb_send, tcp_acceptset);
tcp_connect(pcb_send, &ipaddr, 4000, tcp_connected);
warcraftiii
6楼-- · 2019-03-26 04:57
打开TCP_INPUT_DEBUT调试宏,发现板子实际已经接收到数据,而且接收的字节数与PC发送的字节数相等。
但是无法进入接收回调函数。接收TCP数据包如下:

tcp_input()
{......
TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err);
......}

#define TCP_EVENT_RECV(pcb,p,err,ret)                           
  do {                                                         
    if((pcb)->recv != NULL) {                                   
      (ret) = (pcb)->recv((pcb)->callback_arg,(pcb),(p),(err));
    } else {
      //进入到这里,(pcb->recv == NULL)                        
      (ret) = tcp_recv_null(NULL, (pcb), (p), (err));           
    }                                                           
  } while (0)

debug结果是进入到tcp_recv_null(NULL, (pcb), (p), (err));
也就是说pcb->recv并没有指向回调函数。

调了一天,哇哇大哭呀!!!

一周热门 更多>

相关问题

    相关文章