2016-04-05 14 views
0

Wenn ich dieses Programm starte (siehe unten), funktioniert alles gut. Aber wenn ich die Daten zurück zu TPCIP deaktivieren, funktioniert das Programm schlecht.Empfangen von Daten von TCP (FreeRTOS, LWIP)

Hier ist Programm, adaequat: [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; 
} 

Und diese Funktion gehen hier: 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; 
} 

Complet Kommunikation in Aufgabe FreeRTOS implementieren ist:

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

Aber wenn ich kann nur von TCP zu lesen, und ich möchte nicht, Daten zu TCPIP zurück, Programm arbeite schlecht .: [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; 
} 

Antwort

0

Es ist ein sehr altes Beispiel dafür, wie FreeRTOS mit lwIP im FreeRTOS Interactive site zu verwenden. Obwohl eine Menge des in diesem Beispiel enthaltenen Codes inzwischen ersetzt wurde, sollte die Integration mit lwIP weiterhin gültig sein und eine Referenz für Sie darstellen.

Wenn Sie einen der unter FreeRTOS+TCP examples page aufgelisteten Prozessoren verwenden (FreeRTOS + TCP ist der eigene TCP/IP-Stack von FreeRTOS), kann dies eine weitere Referenz liefern.

0

Ich versuche alles.

Es gibt einen Fehler, aber was? Wenn ich ping versuche, ist alles richtig gemacht.

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

Ok. Ich bin doof. Der Fehler war hier:

Ich erstellte freeRTOS Task, wo ich alle 5 Millisekunden zwei Funktionen in der Schleife aufrufen.

Das ist falsch:

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

Das ist gut

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