你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于ucos ii + lwip tcp server的问题

[复制链接]
GHOST-JP 提问时间:2018-1-15 09:54 /

大佬们,小弟最近用ucos ii + lwip做tcp server。现在只是做一个简单的回传实验,一共两个任务,一个收一个发的,收的任务收到数据之后拷贝到发送buffer,给发的任务发一个信号,发的任务把收到的再发回去。但是一直死在netconn_accept里面。err一直是-3,也就是连接超时,调试软件那边连接的时候也显示1035 未知错误,有大佬遇到过这种情况么,小弟lwip新手,刚开始接触这个。板子是可以ping通的,代码里面还有一个udp收发的,是可以运行的,所以硬件应该是没什么问题的,下面是我的tcp server收发部分的代码:

  1. <div style="text-align: left;"><p style="line-height: 30px; text-indent: 2em;"></p><div class="blockcode"><blockquote><div>void taskTcpServerRecv(void *data)</div><div>{</div><div>err_t err;</div><div>OS_CPU_SR cpu_sr;</div><div>uint32_t dataCount = 0;</div>    <div>
  2. </div><div>newTcpServerDataReceivedSem = OSSemCreate(0);</div><div>OSEventNameSet(newTcpServerDataReceivedSem,"TcpServerDataReady",(INT8U *)&err);</div><div>struct netbuf  *recvBuff;</div><div>tcpServerConn = netconn_new(NETCONN_TCP);</div><div>if(tcpServerConn)</div><div>{</div><div>err = netconn_bind(tcpServerConn,IP_ADDR_ANY,8088);</div><div>err = netconn_listen(tcpServerConn); </div><div>tcpServerConn->recv_timeout = 500;</div><div>for(;;)</div><div>{</div><div>err = netconn_accept(tcpServerConn,&newTcpServerConn);</div><div>if(err == ERR_OK)</div><div>{</div><div>newTcpServerConn->recv_timeout = 10;</div><div>for(;;)</div><div>{</div><div>err = netconn_recv(newTcpServerConn,&recvBuff);</div><div>if((err == ERR_OK) && (recvBuff != NULL))</div><div>{ </div><div>OS_ENTER_CRITICAL();</div><div>memset(TCPServerBuff.rxBuffer,0,TCPServerBuff.rxBufferSize);</div><div>for(struct pbuf *q = recvBuff->p;q != NULL;q = q->next)</div><div>{</div><div>if(q->len > (TCPServerBuff.rxBufferSize - dataCount)) </div><div>memcpy(TCPServerBuff.rxBuffer + dataCount,q->payload,(TCPServerBuff.rxBufferSize - dataCount));</div><div>else </div><div>memcpy(TCPServerBuff.rxBuffer + dataCount,q->payload,q->len);</div><div>dataCount += q->len; </div><div>if(dataCount > TCPServerBuff.rxBufferSize) </div><div>break;</div><div>}</div><div>OS_EXIT_CRITICAL();</div><div>TCPServerBuff.rxCount = dataCount;</div><div>dataCount=0;</div><div>netbuf_delete(recvBuff);</div><div>OSSemPost(newTcpServerDataReceivedSem);</div><div>}</div><div>else if(err == ERR_CLSD)</div><div>{</div><div>netconn_close(newTcpServerConn);</div><div>netconn_delete(newTcpServerConn);</div><div>break;</div><div>}</div><div>OSTimeDlyHMSM (0,0,0,10);</div><div>}</div><div>}</div><div>GPIOE->ODR ^= GPIO_Pin_15;</div><div>OSTimeDlyHMSM (0,0,0,500);</div><div>}</div><div>}</div><div>else</div><div>{</div><div>for(;;)</div><div>{</div><div>OSTimeDlyHMSM (0,0,0,10);</div><div>}</div><div>}</div><div>}</div><div>
  3. </div><div>
  4. </div><div>void taskTcpServerSend(void *data)</div><div>{</div><div>INT8U err;</div><div>for(;;)</div><div>{</div><div>OSSemPend(newTcpServerDataReceivedSem,0,&err);</div><div>memcpy((uint8_t *)TCPServerBuff.txBuffer,(uint8_t *)(TCPServerBuff.rxBuffer),TCPServerBuff.rxCount);</div><div>err = netconn_write(newTcpServerConn,(uint8_t *)TCPServerBuff.txBuffer,TCPServerBuff.rxCount, NETCONN_COPY);</div><div>TCPServerBuff.rxCount = 0;</div><div>OSTimeDlyHMSM (0,0,0,10);</div><div>}</div><div>}</div><div>
  5. </div><div>
  6. </div>
复制代码




调试软件.png
代码.png
ping.png
udp.png
收藏 1 评论6 发布时间:2018-1-15 09:54

举报

6个回答
GHOST-JP 回答时间:2018-1-15 10:02:59
代码有问题,重新发一下
  1. void taskTcpServerRecv(void *data)
  2. {
  3.     err_t err;
  4.     OS_CPU_SR cpu_sr;
  5.     uint32_t dataCount = 0;
  6.    
  7.     newTcpServerDataReceivedSem = OSSemCreate(0);
  8.     OSEventNameSet(newTcpServerDataReceivedSem,"TcpServerDataReady",(INT8U *)&err);
  9.     struct netbuf  *recvBuff;
  10.     tcpServerConn = netconn_new(NETCONN_TCP);
  11.     if(tcpServerConn)
  12.     {
  13.         err = netconn_bind(tcpServerConn,IP_ADDR_ANY,8088);
  14.         err = netconn_listen(tcpServerConn);
  15. //                tcpServerConn->recv_timeout = 500;
  16.         for(;;)
  17.         {
  18.             err = netconn_accept(tcpServerConn,&newTcpServerConn);
  19.             if(err == ERR_OK)
  20.             {
  21.                 newTcpServerConn->recv_timeout = 10;
  22.                 for(;;)
  23.                 {
  24.                     err = netconn_recv(newTcpServerConn,&recvBuff);
  25.                     if((err == ERR_OK) && (recvBuff != NULL))
  26.                     {
  27.                         OS_ENTER_CRITICAL();
  28.                         memset(TCPServerBuff.rxBuffer,0,TCPServerBuff.rxBufferSize);
  29.                         for(struct pbuf *q = recvBuff->p;q != NULL;q = q->next)
  30.                         {
  31.                             if(q->len > (TCPServerBuff.rxBufferSize - dataCount))
  32.                                 memcpy(TCPServerBuff.rxBuffer + dataCount,q->payload,(TCPServerBuff.rxBufferSize - dataCount));
  33.                             else
  34.                                 memcpy(TCPServerBuff.rxBuffer + dataCount,q->payload,q->len);
  35.                             dataCount += q->len;         
  36.                             if(dataCount > TCPServerBuff.rxBufferSize)
  37.                                 break;
  38.                         }
  39.                         OS_EXIT_CRITICAL();
  40.                         TCPServerBuff.rxCount = dataCount;
  41.                         dataCount=0;
  42.                         netbuf_delete(recvBuff);
  43.                         OSSemPost(newTcpServerDataReceivedSem);
  44.                     }
  45.                     else if(err == ERR_CLSD)
  46.                     {
  47.                         netconn_close(newTcpServerConn);
  48.                         netconn_delete(newTcpServerConn);
  49.                         break;
  50.                     }
  51.                                         OSTimeDlyHMSM (0,0,0,10);
  52.                 }
  53.             }
  54.                         GPIOE->ODR ^= GPIO_Pin_15;
  55.             OSTimeDlyHMSM (0,0,0,500);
  56.         }
  57.     }
  58.     else
  59.     {
  60.         for(;;)
  61.         {
  62.             OSTimeDlyHMSM (0,0,0,10);
  63.         }
  64.     }
  65. }


  66. void taskTcpServerSend(void *data)
  67. {
  68.     INT8U err;
  69.     for(;;)
  70.     {
  71.         OSSemPend(newTcpServerDataReceivedSem,0,&err);
  72.         memcpy((uint8_t *)TCPServerBuff.txBuffer,(uint8_t *)(TCPServerBuff.rxBuffer),TCPServerBuff.rxCount);
  73.         err = netconn_write(newTcpServerConn,(uint8_t *)TCPServerBuff.txBuffer,TCPServerBuff.rxCount, NETCONN_COPY);
  74.         TCPServerBuff.rxCount = 0;
  75.         OSTimeDlyHMSM (0,0,0,10);
  76.     }
  77. }
复制代码
shanji 回答时间:2018-1-15 10:08:52
https://www.stmcu.org.cn/module/forum/thread-609701-1-1.html

这也建了两个任务,ucosii+lwip,一个用来发送camera数据,作server,另一个接收客户端发来的消息,可以看看有没有什么灵感。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

GHOST-JP 回答时间:2018-1-15 10:22:10
shanji 发表于 2018-1-15 10:08
https://www.stmcu.org.cn/module/forum/thread-609701-1-1.html

这也建了两个任务,ucosii+lwip,一个用来发 ...

基本上一样的操作啊。。。。都是new,bind,listen,accept。。。
GHOST-JP 回答时间:2018-1-16 08:26:07
大佬们都没有遇到过吗??
ttwutuobang 回答时间:2018-2-8 23:11:45
围观

评分

参与人数 1ST金币 -1 收起 理由
zero99 -1 求助帖禁止灌水

查看全部评分

GHOST-JP 回答时间:2018-2-28 11:10:02
解决了,原来是在netif_add()那边的input应该用tcpip_input

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结帖奖励

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版