6-2-4 解决第一次发送失败
一般收发流程为
服务器:1.监听,3.接受连接,5.接收数据
客户端:2.连接,4.发数据
发生错误原因为accept函数执行的太慢(内部要发生AT命令,等待回复,创建socket),上位机发来数据时,还没来及分配scoket,第一包数据被丢弃。因此后台任务可以在接收的时候分配一个socket。
/* 如果根据hw_socket找不到socket结构体,也给它分配一个 */if (socket == -1){socket = w800_socket(AF_INET, 0, 0);if (socket != -1){w800_set_hwsocket(socket, hw_socket);}}
为返回出错状态,这里设置有限等待时间
while(pdPASS != xSemaphoreTake(ptDev->socket[socket].at_packet_sem,1000)){status = w800_get_status(socket);//该函数根据w800_accept改编而来//2为连接状态,其它状态为断开,可在多处进行状态判断if(status != 2){closesocket(socket);return -1; //返回给上级程序,处理错误,提高程序稳定性} }比如在上层程序这里: do {rc = modbus_receive(ctx, query);/* Filtered queries return 0 */ } while (rc == 0);if (rc < 0 ) {/* socket出错 * 重连*/Draw_String(0, 80, "wait re-connect ...", 0xff0000, 0);while (1){socket_client = modbus_tcp_accept(ctx, &socket_server);if (socket_client >= 0)break;}Draw_String(0, 96, "Modbus client re-connected", 0xff0000, 0);continue;}
6.3 跟上位机的ModbusTCP综合调试
进一步解释:
参数传入整个数据包是为了完完整整的回复请求。