Как я могу отправлять данные с LWIP периодически надлежащим образом? - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь периодически отправлять клиенту некоторые данные с помощью LWIP с микроконтроллера.Я начал с кода из примера Atmel-Studio, который называется «Базовый пример lwIP Raw HTTP».После отправки около 100 объектов разрывается соединение.

Я посылаю сигнал сердцебиения и другой объект каждые 100 мс от клиента к микроконтроллеру.Тогда моя функция receive-callback вызывается из lwIP.Отправка данных таким способом работает нормально.

Но я хочу отправить данные отсоединенными от получения данных.В моей попытке я посылаю данные с теми же функциями, которые я также использую в контексте обратного вызова, но в основном цикле while.Я использую указатель на tcp_pcb из инициализации в own_init ().Когда соединение разрывается, состояние печатной платы изменяется с УСТАНОВЛЕНО на ЗАКРЫТО.Я подозреваю, что я неправильно использую указатели 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;

} 
...