2016-12-29 301 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