【问题标题】:LwIP Netconn API - Check if TCP communication was completedLwIP Netconn API - 检查 TCP 通信是否完成
【发布时间】:2020-11-06 09:04:52
【问题描述】:

我目前正在为特定用例创建测试,其中之一是 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);
}

【问题讨论】:

    标签: embedded rtos lwip


    【解决方案1】:

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

    【讨论】:

    猜你喜欢
    • 2012-05-03
    • 2015-06-12
    • 2016-04-16
    • 1970-01-01
    • 2013-02-08
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多