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

Embedded LwIP Netconn API-检查TCP通信是否已完成,embedded,rtos,lwip,Embedded,Rtos,Lwip,我目前正在为特定用例创建测试,其中之一是Init WF200->connect to AP->send TCP data->Deinit WF200。该应用程序非常节能,因此我必须确保WF200的启用时间尽可能短。 我使用的硬件是EFM32GG11 MCU和WF200 WIFI收发器,两者都来自SiliconLabs。我将RTOS和lwip堆栈与netconn API一起用于TCP通信 问题是我找不到一种方法来知道TCP事务是否已完成,我需要在关闭WF200之前知道这一点。目前,该任务比实际传输

我目前正在为特定用例创建测试,其中之一是Init WF200->connect to AP->send TCP data->Deinit WF200。该应用程序非常节能,因此我必须确保WF200的启用时间尽可能短。 我使用的硬件是EFM32GG11 MCU和WF200 WIFI收发器,两者都来自SiliconLabs。我将RTOS和lwip堆栈与netconn API一起用于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);}添加到代码中,并等待回调完成。也许在回调中发布一个标志,您可以检查。例如,您可以使用该数据接收回调(或错误回调等),检查确认,然后写入可以在代码的while循环中检查的var。

请更好地格式化您的答案。请阅读以改进答案的格式。