2016-12-29 9 views
0

私はLwIP_HTTP_Server_Netconn_RTOS(STM32CubeMX)というプロジェクトを作成し、ここに表示するようにTCPサーバーコードを変更しました。しかし、クライアント側で私はこのような結果を得る:STM32 LWIP netconn_writeがサイクル中にあります

S:SET/ のNum:1 のNum:6 のNum:6 のNum:6 のNum:6 のNum:7 のNum: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

程度netconn_write()のlwIPのこの非公式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:

のいずれかを0
  • NETCONN_NOCOPYデータが送信(スタック)
の時間の間安定していない場合、データが送信(静的データまたはヒープ)
  • NETCONN_COPYの 時間にわたって安定している場合

    あなたの最初の間違いは、許可されていないNETCONN_NOFLAGを渡すことです。おそらくNETCONN_NOFLAGは数値的にNETCONN_NOCOPYに等しい。その場合、lwIPはバッファから直接データを送信しますが、これはバックグラウンドで行われます。 netconn_write(..., NETCONN_NOCOPY)が返された場合は、NOT送信が完了するまで渡したバッファを変更する必要があります。進行中の送信中に変更するため、受信側で間違った結果が得られます。

    送信が完了したという情報を得るのはかなり難しいでしょう。これはコールバックでのみ行うことができます。あなたがそれをしたとしても、これはあなたには何のメリットも与えません。とにかく "送信完了"イベントを待たなければなりません。したがって、ここでの最良の選択は、NETCONN_COPYを使用することです。

  • +0

    ありがとうございます!今それは動作します – Eugene