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

关于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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版