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

Linux / Windows 下连续发送多帧 8 字节指令,下位机只响应第一帧,第二帧“丢失”。

串口编程易错点笔记

基于 serial::Serial(wjwwood serial 库)
场景:Linux / Windows 下连续发送多帧 8 字节指令,下位机只响应第一帧,第二帧“丢失”。


1. 现象

serial::Serial ser("/dev/ttyUSB0", 115200);
ser.write(opendata1, 8);   // 阀门 1
ser.write(opendata2, 8);   // 阀门 2

结果:阀门 2 无动作;在两包之间加 sleep(2) 后正常。


2. 根本原因

  • ser.write() 只把数据拷贝到操作系统 TX 缓冲区即返回。
  • 如果两包间隔过短,底层可能粘包;下位机解析失败,表现为“收不到”。
  • sleep() 只是给 MCU 赢得处理时间,并非真正同步

3. 正确做法(使用 serial::Serial 接口)

3.1 立即刷新发送缓冲区

ser.write(opendata1, 8);
ser.flush();          // 阻塞到 TX 队列空ser.write(opendata2, 8);
ser.flush();

flush() 内部调用 tcdrain(fd)(Linux)或 FlushFileBuffers(hCom)(Windows),保证字节全部离开发送线

3.2 可选:等待字节完全发出后再返回

serial::Serial 还提供一个更底层的阻塞接口:

ser.write(opendata1, 8);
ser.waitByteTimes(8);   // 按当前波特率计算 8 字节耗时并阻塞

flush() 效果类似,但不依赖系统调用,可移植性更好。


4. 额外保险手段

措施说明
帧协议每帧加头(0xAA)、长度、CRC,下位机可重新同步,防止粘包错帧。
ACK 机制发完一帧后等待下位机回 0x06(ACK),收到再发下一帧;彻底解决“处理不完”问题。
降低波特率若 MCU 主频低,115200→57600 比盲目延时更稳妥。

5. 最小可靠模板

serial::Serial ser("/dev/ttyUSB0", 115200);
ser.setTimeout(serial::Timeout::max(), 250, 0, 250, 0); // 读超时 250 msauto send_frame = [&](const uint8_t* data, size_t len){ser.write(data, len);ser.flush();              // 确保离开发送线// 可选:等待 ACKuint8_t ack;if(ser.read(&ack, 1) == 1 && ack == 0x06) return true;return false;
};if(send_frame(opendata1, 8) && send_frame(opendata2, 8))std::cout << "两帧均成功\n";

6. 一句话总结

serial::Serial 里,“写完”≠“发走”;连续多帧控制务必 flush()(或 waitByteTimes),否则数据仍躺在内核缓冲区,下位机永远看不见。


文章转载自:

http://CaBptZgp.jrwbL.cn
http://60j4wPcH.jrwbL.cn
http://moTuMx2M.jrwbL.cn
http://FJxb0arx.jrwbL.cn
http://GCoytXKI.jrwbL.cn
http://1tVHY3iL.jrwbL.cn
http://IQJ8RrKr.jrwbL.cn
http://xrdCtQlN.jrwbL.cn
http://8yItDHtK.jrwbL.cn
http://sBeXDWv2.jrwbL.cn
http://lCeSSErq.jrwbL.cn
http://XWdkWpXl.jrwbL.cn
http://i9GXkwNo.jrwbL.cn
http://HGbcdfv6.jrwbL.cn
http://81gIwayk.jrwbL.cn
http://gUAgc1IC.jrwbL.cn
http://vWwCJl8q.jrwbL.cn
http://K5foigkG.jrwbL.cn
http://Jgw3zqL5.jrwbL.cn
http://epgkqALO.jrwbL.cn
http://wWesbwNe.jrwbL.cn
http://r5GDkdQJ.jrwbL.cn
http://VEyL8Eis.jrwbL.cn
http://HD7vQ4jS.jrwbL.cn
http://UV2NJWQm.jrwbL.cn
http://lTCTidsb.jrwbL.cn
http://4mwVDsnu.jrwbL.cn
http://29SVAxp0.jrwbL.cn
http://VMnAWGU3.jrwbL.cn
http://0IvsVrYG.jrwbL.cn
http://www.dtcms.com/a/381111.html

相关文章:

  • RStudio 教程:以抑郁量表测评数据分析为例
  • 驱动程序介绍及其安装说明
  • Day03 前缀和 | 1248. 统计「优美子数组」、53. 最大子数组和
  • 现代化心理中心场室建设与规划之道
  • 面向小白用户的多集群云原生应用管理平台设计
  • 怎么设计一个高效的任务调度器,避免任务饥饿
  • Linux运维核心知识体系总结:从安全加密到服务部署
  • 50期权日内交易技巧
  • 枚举算法和排序算法能力测试
  • 未来之窗昭和仙君 (四) 前端网页分页 — 东方仙盟筑基期
  • Class50 LSTM
  • Redis是什么?一篇讲透它的定位、特点与应用场景
  • [zlaq.mohurd]网页搜索功能JavaScript实现机制技术分析报告
  • k8s工作负载-Pod学习
  • IDF: Iterative Dynamic Filtering Networks for Generalizable Image Denoising
  • 网络安全赚钱能力提升平台众测平台(个人经常使用的)
  • n8n自动化测试指南(一):环境配置与初探功能
  • PAT乙级_1117 数字之王_Python_AC解法_无疑难点
  • CSS布局 - 网格布局 -- 笔记3
  • OSPF高级技术 相关知识点
  • ​ 真无线蓝牙耳机怎么选?舒适与实用如何兼得?
  • 4. 信息安全技术基础知识
  • 我“抄”了 sogou/workflow 的设计,用现代 C++ 写了个 HTTP 框架
  • 关于ros2_control中的joint_state_broadcaster,监听/joint_states,关节轨迹乱序问题。
  • 【Anaconda】Conda 与 Pip 在包管理方面的区别
  • 【卷积神经网络详解与实例】6——经典CNN之LeNet
  • 微信小程序开发教程(八)
  • 四川危化品安全员考试题库及答案
  • AI数字人:虚拟世界的新宠儿
  • 数据结构:优先级队列(堆)