【发布时间】: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);
}
【问题讨论】: