2016-04-05 92 views
0

このプログラムを起動すると(下記参照)、すべて正常に動作しています。しかし、TPCIPに戻るデータを無効にすると、プログラムがうまく動作しません。ここでTCP(FreeRTOS、LWIP)からデータを受信

は正常に動作し、プログラムである:[1]:http://s27.postimg.org/seixg63hf/problem_2.jpg

static err_t prijata_data(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) 
{ 
    void *data; 
    if (err == ERR_OK && p != NULL) { 
     // information of receive data 
     tcp_recved(pcb, p->tot_len); 
     //free buffer 
     pbuf_free(p); 
     data = p->payload; //copy value to send out of queue 
     xQueueSend(queue_ethernet, &data, 10); //send value to queue 
     //send data out 
     err = tcp_write(pcb, p->payload, p->len, TCP_WRITE_FLAG_COPY); 
     tcp_sent(pcb, NULL); // No need to call back 
    } 
    else 
    { 
     pbuf_free(p); 
    } 
    if (err == ERR_OK && p == NULL) { 
     close_conn(pcb); 
    } 
    return ERR_OK; 
} 

そして、ここで起こってこの機能: の

static err_t prijimani_dat(void *arg, struct tcp_pcb *pcb, err_t err){ 
    LWIP_UNUSED_ARG(arg); 
    LWIP_UNUSED_ARG(err); 
    tcp_setprio(pcb, TCP_PRIO_MIN); 
    tcp_recv(pcb, prijata_data); 
    tcp_err(pcb, server_err); 
    tcp_poll(pcb, server_poll, 4); 
    return ERR_OK; 
} 

のcompletの通信は、タスクFreeRTOSでの実施です:

extern void TCP_connection(void *pvParameters) 
{ 
    UNUSED(pvParameters); 
    const portTickType xDelayTime = 5/portTICK_RATE_MS; 

    struct tcp_pcb *tcp_server; 
    tcp_server = tcp_new(); 

    tcp_bind(tcp_server, IP_ADDR_ANY, TCP_PORT); 

    while (1){ 
     tcp_server = tcp_listen(tcp_server); 
     tcp_accept(tcp_server, prijimani_dat); 

     vTaskDelay(xDelayTime); 
    } 
} 

唯一のTCPから読んで、私は悪い作業TCPIPにデータ、プログラムをバックしたくない: [2]:http://s21.postimg.org/wlhqh31g5/problem_1.jpg

static err_t prijata_data(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err){ 
    void *data; 

    if (err == ERR_OK && p != NULL) { 
     /* information of receive data */ 
     tcp_recved(pcb, p->tot_len); 

     //free buffer 
     pbuf_free(p); 

     data = p->payload; /*copy value to send out of queue*/ 
     xQueueSend(queue_ethernet, &data, 10); //send value to queue 
    } 
    else 
    { 
     pbuf_free(p); 
    } 

    if (err == ERR_OK && p == NULL) { 
     close_conn(pcb); 
    } 
    return ERR_OK; 
} 

答えて

0

FreeRTOS Interactive siteでのlwIPでFreeRTOSを使用する方法の非常に古い例があります。この例に含まれているコードの多くは現在では置き換えられていますが、lwIPとの統合は依然として有効であり、参考にしてください。

FreeRTOS+TCP examples page(FreeRTOS + TCPがFreeRTOSの独自のTCP/IPスタックである)に記載されているプロセッサのいずれかを使用している場合、それはさらなる参照を提供する可能性があります。

0

私はすべてを試しています。

何か間違いがありますが、何ですか?私がpingを試みるとき、すべては正しく行われます。

C:\>ping 192.168.0.145 -n 10 

Pinging 192.168.0.145 with 32 bytes of data: 
Reply from 192.168.0.145: bytes=32 time=2ms TTL=255 
Reply from 192.168.0.145: bytes=32 time=4ms TTL=255 
Reply from 192.168.0.145: bytes=32 time<1ms TTL=255 
Reply from 192.168.0.145: bytes=32 time=1ms TTL=255 
Reply from 192.168.0.145: bytes=32 time<1ms TTL=255 
Reply from 192.168.0.145: bytes=32 time<1ms TTL=255 
Reply from 192.168.0.145: bytes=32 time<1ms TTL=255 
Reply from 192.168.0.145: bytes=32 time=1ms TTL=255 
Reply from 192.168.0.145: bytes=32 time<1ms TTL=255 
Reply from 192.168.0.145: bytes=32 time<1ms TTL=255 

Ping statistics for 192.168.0.145: 
    Packets: Sent = 10, Received = 10, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
    Minimum = 0ms, Maximum = 4ms, Average = 0ms 
0

私は愚かだ。間違いはここにありました:

私はfreeRTOSタスクを作成しました。私は5ミリ秒ごとに2つの関数をループで呼び出します。

これは間違っている:

extern void TCP_connection(void *pvParameters) 
{ 
    UNUSED(pvParameters); 
    const portTickType xDelayTime = 5/portTICK_RATE_MS; 

    struct tcp_pcb *tcp_server; 
    tcp_server = tcp_new(); 

    if (tcp_bind(tcp_server, IP_ADDR_ANY, TCP_PORT) != ERR_OK) 
     return; 

    while (1){ 
    tcp_server = tcp_listen(tcp_server); 
    tcp_accept(tcp_server, server_accept); 

     vTaskDelay(xDelayTime); 
    } 
} 

これは良いです

extern void TCP_connection(void *pvParameters) 
{ 
    UNUSED(pvParameters); 
    const portTickType xDelayTime = 5/portTICK_RATE_MS; 

    struct tcp_pcb *tcp_server; 
    tcp_server = tcp_new(); 

    if (tcp_bind(tcp_server, IP_ADDR_ANY, TCP_PORT) != ERR_OK) 
     return; 

    tcp_server = tcp_listen(tcp_server); 
    tcp_accept(tcp_server, server_accept); 

    while (1){ 
     vTaskDelay(xDelayTime); 
    } 
} 
関連する問題