问题描述
我目前正在针对特定用例创建测试,其中一种是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 循环。