2016-12-29 39 views
0

我已经采取了项目LwIP_HTTP_Server_Netconn_RTOS(STM32CubeMX)并更改了TCP服务器代码以显示在此处。但在客户端侧我得到导致这样的:STM32 LWIP netconn_write在周期

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

见了lwIP的这种非官方的维基约netconn_write()

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将直接从缓冲区发送数据,但这将在“后台”完成。当netconn_write(..., NETCONN_NOCOPY)返回时,您必须不是修改您传递的缓冲区,直到传输完成。由于您在正在进行的传输过程中对其进行了修改,因此在接收端会得到错误的结果

在你的情况下,很难得到传输完成的信息 - 这只能通过回调才能完成。即使你这样做,这也不会给你带来任何好处,因为你不得不等待“传输完成”事件。所以这里最好的选择是使用NETCONN_COPY

+0

非常感谢!现在它可以工作 – Eugene