首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从TCP (FreeRTOS,LWIP)接收数据

从TCP (FreeRTOS,LWIP)接收数据
EN

Stack Overflow用户
提问于 2016-04-05 13:07:49
回答 3查看 1.8K关注 0票数 0

当我启动这个程序(见下文)时,一切正常。但是,当我禁用返回数据回TPCIP,程序工作不好。

这是一个程序,工作正常: 1:2.jpg

代码语言:javascript
复制
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;
}

这个函数在这里:s

代码语言:javascript
复制
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;
}

在任务FreeRTOS中实现了完全通信:

代码语言:javascript
复制
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读取数据,并且我不想将数据返回TCP时,程序工作得很糟糕.: 2:1.jpg

代码语言:javascript
复制
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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-05 13:29:21

关于如何在FreeRTOS中与lwIP一起使用FreeRTOS互动网站,有一个非常老的例子。虽然这个示例中包含的许多代码现在已经被取代,但是与lwIP的集成仍然是有效的,并为您提供了一个参考。

如果您使用的是FreeRTOS+TCP示例页上列出的处理器之一(FreeRTOS+TCP是FreeRTOS自己的TCP/IP堆栈),那么这可能会提供进一步的参考。

票数 0
EN

Stack Overflow用户

发布于 2016-04-05 13:57:39

我尽了全力。

有任何错误,但是什么?当我尝试ping时,所有的操作都是正确的。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-04-06 08:48:53

好的。我太蠢了。错误就在这里:

我创建了freeRTOS任务,每5毫秒调用循环中的两个函数。

这是错误的:

代码语言:javascript
复制
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);
    }
}

这是很好的

代码语言:javascript
复制
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);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36427287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档