2016-04-05 20 views
0

'dan veri alma Bu programı başlattığımda (aşağıya bakın), her şey düzgün çalışıyor. Ama geri dönüş verilerini TPCIP'e geri döndürdüğümde, program kötü çalışıyor.TCP (FreeRTOS, LWIP)

İşte programdır, çalışma ince: [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; 
} 

Ve bu fonksiyon burada olacak:

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); 
    } 
} 
: s

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; 
} 

Komplet iletişim görev freertos uygulamak edilir

Ama ne zaman yapabilirim Sadece TCP okuma hem de kötü çalışma TCPIP veri, programı geri istemiyoruz .: [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; 
} 

cevap

0

FreeRTOS Interactive site yılında lwIP ile freertos nasıl kullanılacağına dair çok eski bir örnek vardır. Bu örnekte yer alan birçok kod artık yerine getirilmiş olsa da, lwIP ile entegrasyon hala geçerli olmalı ve sizin için bir referans oluşturmalıdır.

FreeRTOS+TCP examples page (FreeRTOS + TCP FreeRTOS'un kendi TCP/IP yığını) üzerinde listelenen işlemcilerden birini kullanıyorsanız, bu daha fazla başvuru sağlayabilir.

0

Hepsini deniyorum.

Herhangi bir hata var, ama ne? Ping yapmayı denediğimde, hepsi doğru şekilde yapılır.

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

Tamam. Aptalım. Hata buradaydı:

Her 5 milisaniyede bir döngüde iki işlevi çağıracağım freeRTOS görevini yarattım.

BU YANLIŞ OLDUĞU:

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); 
    } 
} 

BU İYİ OLDUĞU

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); 
    } 
}