如何以适当的方式定期使用LWIP发送数据?

时间:2019-02-18 10:30:06

标签: c tcp server client lwip

我正在尝试使用LWIP从微控制器定期向客户端发送一些数据。我从Atmel-Studio示例“ lwIP Raw HTTP基本示例”中的代码开始。发送约100个对象后,连接断开。

我每100毫秒从客户端向微控制器发送一个心跳信号和另一个对象。然后从lwIP调用我的接收回调函数。以这种方式发送数据可以正常工作。

但是我要发送与接收数据解耦的数据。在尝试中,我使用与回调上下文中相同的功能(但在主while循环中)发送数据。我在own_init()中使用从初始化指向tcp_pcb的指针。连接断开时,PCB的状态从ESTABLISHED变为CLOSED。我的怀疑是我错误地使用了pcb指针,但我无法提出另一种方法。谢谢!

int main(void)
{    
    ...

    /* Bring up the ethernet interface & initialize timer0, channel0. */
    init_ethernet();


    /* Bring up the server. */
    struct tcp_pcb* pcb;
    pcb=own_init();


    uint32_t sendInterval=100; //ms
    uint32_t lastTimeSFSsent=0;
    uint32_t lastTimeHeartbeatSent=0;
    uint32_t currentTime=0;
    uint8_t is_connected=0;

    initSFS();

    while(1)
    {

        currentTime=sys_get_ms();

        if(currentTime > lastTimeSFSsent + sendInterval && pcb->state==ESTABLISHED){
            lastTimeSFSsent=sys_get_ms();
            sendSFS(pcb);
        }

        if(currentTime> lastTimeHeartbeatSent + sendInterval && pcb->state==ESTABLISHED){
            lastTimeHeartbeatSent=sys_get_ms();
            sendHeartbeat(pcb);

        }
        ethernet_task();


    }    
} 

这与示例代码不同:

struct tcp_pcb* own_init(void)
{
    struct tcp_pcb *pcb;
    struct tcp_pcb *tpcb;

    pcb = tcp_new();
    tcp_bind(pcb, IP_ADDR_ANY, 5005);
    tpcb = tcp_listen(pcb);
    tcp_accept(tpcb, own_accept);

    return pcb;

} 

0 个答案:

没有答案