如何解决LwIP Netconn API-检查TCP通信是否已完成
我目前正在针对特定用例创建测试,其中一种是Init WF200->连接到AP->发送TCP数据-> Deinit WF200。该应用程序对能源至关重要,因此我必须确保尽可能短地启用WF200。 我使用的硬件是SiliconLabs的EFM32GG11 MCU和WF200 WIFI收发器。我正在使用带有netconn API的RTOS和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,然后写入 var,您可以检查代码的 while 循环。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。