首页 > 解决方案 > LwIP Netconn API - 检查 TCP 通信是否完成

问题描述

我目前正在为特定用例创建测试,其中之一是 Init WF200 -> 连接到 AP -> 发送 TCP 数据 -> Deinit WF200。该应用程序对能源非常关键,因此我必须确保 WF200 尽可能短地启用。我使用的硬件是来自 SiliconLabs 的 EFM32GG11 MCU 和 WF200 WIFI 收发器。我正在使用 RTOS 和带有 netconn API 的 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);
}

标签: embeddedrtoslwip

解决方案


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


推荐阅读