当前位置: 首页 > ops >正文

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综合调试

进一步解释:

参数传入整个数据包是为了完完整整的回复请求。

http://www.xdnf.cn/news/20276.html

相关文章:

  • Android应用完全重启指南:从任务重置到进程重生
  • 第五十三天(sql注入)
  • FTL(Flash Translation Layer)
  • [从零开始面试算法] (12/100) LeetCode 121. 买卖股票:一次遍历的“后悔药”
  • 高维前缀和
  • Android系统更新系统webview. 2025-09-06
  • gcloud cli 使用 impersonate模拟 服务帐号
  • 2025年财会专业人士职业发展认证路径分析
  • 从“帮写文案”到“管生活”:个人AI工具的边界在哪?
  • Transformer架构(详解)
  • 记一次:mysql的json及json数组使用组合使用
  • 【基础-单选】关于UIAbility的启动模式,下列说法错误的是:
  • Redis 事务与 Lua 脚本:原子操作实战指南
  • LeetCode 2461.长度为K子数组中的最大和
  • 【FastDDS】 Entity Policy 之 标准Qos策略
  • OpenHarmony之USB Manager 架构深度解析
  • 【视网膜分割】AFMIP-Net:一种新型的自适应特征调制和隐式提示网络
  • AI、人工智能础: 实体命名!
  • 郭平《常变与长青》读书笔记(第一章)
  • QT之实现点击按钮启动另一个桌面应用程序
  • 【开题答辩全过程】以 停车场管理系统的设计与实现为例,包含答辩的问题和答案
  • 点晴模切ERP与MES系统整合:模切工厂数字化转型关键
  • 内网后渗透攻击--linux系统(横向移动)
  • Python趣味入门:打印与计算初体验
  • 垃圾收集器分类
  • 「数据获取」《中国电力统计年鉴》(1993-2024)(含中国电力年鉴)
  • 分布式数据库的历史演变与核心原理
  • SpringBoot配置文件
  • 【CSP-S】数据结构 ST 表详解
  • 植物大战僵尸融合版安装包,下载安装教程