GHOST-JP 发表于 2018-1-15 09:54:41

关于ucos ii + lwip tcp server的问题

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



GHOST-JP 发表于 2018-1-15 10:02:59

代码有问题,重新发一下
void taskTcpServerRecv(void *data)
{
    err_t err;
    OS_CPU_SR cpu_sr;
    uint32_t dataCount = 0;
   
    newTcpServerDataReceivedSem = OSSemCreate(0);
    OSEventNameSet(newTcpServerDataReceivedSem,"TcpServerDataReady",(INT8U *)&err);
    struct netbuf*recvBuff;
    tcpServerConn = netconn_new(NETCONN_TCP);
    if(tcpServerConn)
    {
      err = netconn_bind(tcpServerConn,IP_ADDR_ANY,8088);
      err = netconn_listen(tcpServerConn);
//                tcpServerConn->recv_timeout = 500;
      for(;;)
      {
            err = netconn_accept(tcpServerConn,&newTcpServerConn);
            if(err == ERR_OK)
            {
                newTcpServerConn->recv_timeout = 10;
                for(;;)
                {
                  err = netconn_recv(newTcpServerConn,&recvBuff);
                  if((err == ERR_OK) && (recvBuff != NULL))
                  {
                        OS_ENTER_CRITICAL();
                        memset(TCPServerBuff.rxBuffer,0,TCPServerBuff.rxBufferSize);
                        for(struct pbuf *q = recvBuff->p;q != NULL;q = q->next)
                        {
                            if(q->len > (TCPServerBuff.rxBufferSize - dataCount))
                              memcpy(TCPServerBuff.rxBuffer + dataCount,q->payload,(TCPServerBuff.rxBufferSize - dataCount));
                            else
                              memcpy(TCPServerBuff.rxBuffer + dataCount,q->payload,q->len);
                            dataCount += q->len;       
                            if(dataCount > TCPServerBuff.rxBufferSize)
                              break;
                        }
                        OS_EXIT_CRITICAL();
                        TCPServerBuff.rxCount = dataCount;
                        dataCount=0;
                        netbuf_delete(recvBuff);
                        OSSemPost(newTcpServerDataReceivedSem);
                  }
                  else if(err == ERR_CLSD)
                  {
                        netconn_close(newTcpServerConn);
                        netconn_delete(newTcpServerConn);
                        break;
                  }
                                        OSTimeDlyHMSM (0,0,0,10);
                }
            }
                        GPIOE->ODR ^= GPIO_Pin_15;
            OSTimeDlyHMSM (0,0,0,500);
      }
    }
    else
    {
      for(;;)
      {
            OSTimeDlyHMSM (0,0,0,10);
      }
    }
}


void taskTcpServerSend(void *data)
{
    INT8U err;
    for(;;)
    {
      OSSemPend(newTcpServerDataReceivedSem,0,&err);
      memcpy((uint8_t *)TCPServerBuff.txBuffer,(uint8_t *)(TCPServerBuff.rxBuffer),TCPServerBuff.rxCount);
      err = netconn_write(newTcpServerConn,(uint8_t *)TCPServerBuff.txBuffer,TCPServerBuff.rxCount, NETCONN_COPY);
      TCPServerBuff.rxCount = 0;
      OSTimeDlyHMSM (0,0,0,10);
    }
}

shanji 发表于 2018-1-15 10:08:52

https://www.stmcu.org.cn/module/forum/thread-609701-1-1.html

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

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

围观

GHOST-JP 发表于 2018-2-28 11:10:02

解决了,原来是在netif_add()那边的input应该用tcpip_input
页: [1]
查看完整版本: 关于ucos ii + lwip tcp server的问题