STM32 LWIP netconn_write在循环中

时间:2016-12-29 23:16:42

标签: stm32 lwip

我已经采用了一个项目LwIP_HTTP_Server_Netconn_RTOS(STM32CubeMX)并更改了TCP服务器代码,如下所示。但在客户端,我得到这样的结果:

S:SET /  数字:1  数字:6  数字:6  数字:6  数字:6  数字:7  数字:7

我做错了什么?

void http_server_serve(struct netconn *conn)
{
struct netbuf *inbuf;
char* buf;
u16_t buflen;
size_t len;
unsigned int call_times = 0;

#define SIZE_ARRAY 21
char data[SIZE_ARRAY]={0};

while(netconn_recv(conn, &inbuf) == ERR_OK)
{
    netbuf_data(inbuf, (void**)&buf, &buflen);

    if ((buflen >=5) && (strncmp(buf, "SET /", 5) == 0))
    {
        for(int i=0;i<7;i++)
        {
            if(conn->state == NETCONN_NONE)
            {
                sprintf(data, " Num: %d\n", ++call_times);
                len = strlen(data);
                printf(" Num: %d\n", call_times);
                netconn_write(conn, (const unsigned char*)(data), (size_t)len, NETCONN_NOFLAG);
            }
        }
        netbuf_delete(inbuf);
    }
}

netconn_close(conn);
netbuf_delete(inbuf);
}

1 个答案:

答案 0 :(得分:1)

请参阅lwIP关于netconn_write()的非官方wiki:

http://lwip.wikia.com/wiki/Netconn_write

  

err_t netconn_write ( struct netconn * aNetConn, const void * aData, size_t aSize, u8_t aApiFlags );

     

[...]

     

aApiFlags:

之一      
      
  • NETCONN_NOCOPY,如果数据稳定的话   传输时间(静态数据或堆)
  •   
  • NETCONN_COPY如果   数据在传输时(堆栈)不稳定
  •   

然后你的第一个错误是通过NETCONN_NOFLAG,这是不允许的。最有可能NETCONN_NOFLAG在数值上等于NETCONN_NOCOPY。在这种情况下,lwIP将直接从您的缓冲区发送数据,但这将在后台&#34;中完成。当netconn_write(..., NETCONN_NOCOPY)返回时,您必须 NOT 修改您传递的缓冲区,直到传输完成。因为您在正在进行的传输过程中对其进行修改,所以在接收方会得到错误的结果。

在你的情况下,很难得到传输完成的信息 - 这只能通过回调来完成。即使你这样做,这也不会给你任何好处,因为你必须等待传输完成&#34;事件无论如何。所以这里最好的选择就是使用NETCONN_COPY