embedded - 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);
}
解决方案
netconn 将执行回调,您可以将 while(1){osDelay(2);} 添加到您的代码中并等待该回调完成。也许在您可以检查的回调中发布一个标志。例如,您可以使用该数据 RX 回调(或错误回调等),检查 ack,然后写入可以检查代码的 while 循环的 var。
推荐阅读
- forms - 在多行表单上关闭键盘 (Pixel2)
- apache-spark - 架构不匹配 - 写入 Delta 的 Spark DataFrame
- java - 在 ArayAdapter 中使用 Spinner 在空对象引用上调用“java.lang.String java.lang.Object.toString()”
- c# - Visual Studio 2019 - 在 WebApp 中添加 WebJob 项目
- javascript - 在没有 svg 的 React 中使用 D3 来处理表格行无法渲染
- excel - 将日历表单与单元格中的日期值同步
- rundeck - 使用临时凭证访问 Rundeck
- macos - Flutter Desktop MACOS 有人有平台通道的例子吗?
- python - 如何获得使用 Zbar 在 AWS lambda 中工作的 python 函数?
- angular - 升级到 Angular 9 后没有 CompilerFactory 的提供者