LwIP Netconn API-检查TCP通信是否已完成

问题描述

我目前正在针对特定用例创建测试,其中一种是Init WF200->连接到AP->发送TCP数据-> Deinit WF200。该应用程序对能源至关重要,因此我必须确保尽可能短地启用WF200。 我使用的硬件是SiliconLabs的EFM32GG11 MCU和WF200 WIFI收发器。我正在使用带有netconn API的RTOS和lwip堆栈进行TCP通信

问题是我无法找到一种方法来知道TCP事务是否已完成,这在将WF200关机之前需要知道。当前,该任务比实际传输要快,从而导致数据丢失和TCP通信不完整。

目前,我正在做一些工作,这会增加延迟。但这对我来说似乎不是一个很好的解决方案,特别是因为延迟取决于发送的数据量。

我已经尝试检查tcp pcb状态,但是没有成功。有什么办法可以阻止线程直到事务完成?

谢谢!

static void tcp_thread(void *p_arg) {
    struct netconn *conn;
    err_t err;
    LWIP_UNUSED_ARG(p_arg);
    // needed,otherwise netconn_connect fails
    KAL_Dly(1);
    conn = netconn_new(NETCONN_TCP);
    if (conn != NULL) {
        struct ip4_addr broker_ip;
        IP_ADDR4(&broker_ip,SERVER_IP_0,SERVER_IP_1,SERVER_IP_2,SERVER_IP_3);
        err = netconn_connect(conn,&broker_ip,65432);
        if (err == ERR_OK) {
            // NOcopY only safe when data is static and const
            err = netconn_write(conn,test_data,strlen(test_data),NETCONN_NOcopY);
            printf("Data sent\n");
            netconn_close(conn);
            netconn_delete(conn);
        } else {
            printf("No TCP connection\n");
        }
    } else {
        printf("No netconn\n");
    }
    KAL_Dly(200);
    sl_wfx_deinit();
    OSTaskDel(0,&err);
}

解决方法

netconn 将执行回调,您可以在代码中添加 while(1){osDelay(2);} 并等待该回调完成。也许在您可以检查的回调中发布一个标志。例如,您可以使用该数据 RX 回调(或错误回调等),检查 ack,然后写入 var,您可以检查代码的 while 循环。