串口编程易错点笔记

基于 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://www.pswp.cn/news/922185.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/922185.shtml
英文地址,请注明出处:http://en.pswp.cn/news/922185.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三十九、案例-配置文件-参数配置化(了解即可,现在主流使用yml配置文件)

参数配置化-问题引出参数配置化-问题解决参数配置化-代码与过程解析代码&#xff1a; AliOSSUtils&#xff08;工具类&#xff09; package com.itheima.utils;import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import org.springframework.beans.factory.…

Linux之virtio实现原理--pci 基础

一、概述 virtio设备可以基于不同总线来实现&#xff0c;本文介绍基于pci实现的virtio-pci设备。以virtio-blk为例&#xff0c;首先介绍PCI配置空间内容&#xff0c;virtio-pci实现的硬件基础——capability&#xff0c;最后分析PIC设备的初始化以及virtio-pci设备的初始化。 …

Claude-Flow AI协同开发:从“CTO”到“人机共生体”的AI协同开发

6.1 思维的终极融合&#xff1a;从“CTO”到“人机共生体” (Human-AI Symbiote) 在之前的章节中&#xff0c;我们逐步将您的角色从“开发者”提升为“项目经理”&#xff0c;最终定位为整个“人机混合团队的CTO”。这个模型强调的是一种 “指挥-控制” (Command-and-Control) …

TCGA单癌肿按单基因高低分组的转录组差异热图分析作图教程

TCGA单癌肿按单基因高低分组的转录组差异热图分析作图教程分析作图原理过程提取出TCGA中指定的单基因单癌肿的转录组表达数据对该单基因的表达水平的中位数作为阈值把样本分成高表达组和低表达组按该基因的高低表达样本分组来做该癌症的转录组差异分析对差异分析结果中top差异高…

手搓Tomcat

目录 Tomcat是什么&#xff1f; 前置工作准备 构建并启动Tomcat 处理Socket逻辑顺序 获取输入流并读取数据封装到Request 自定义Servlet对象 暂存响应体 按Http协议发送响应数据 部署Tomcat ​ Tomcat是什么&#xff1f; Tomcat 是一个 Web 应用服务器&#xff08;准确…

Linux网络:初识网络

文章目录1. 网络发展1.1 独立模式1.2 网络互联1.3 局域网LAN1.4 广域网WAN2. 认识 “协议”2.1 什么是协议&#xff1f;2.2 为什么要有协议&#xff1f;2.3 深入了解协议序&#xff1a;开网络之篇章&#xff0c;建网络之基础&#xff0c;将近2月过去&#xff0c;暑假期间不曾有…

文件检查与拷贝-简化版

本篇继续来学习shell脚本&#xff0c;对上一篇的文件检查与拷贝脚本进行简化修改。 1 功能说明 在Linux系统中&#xff0c;通过一个shell脚本&#xff0c;实现将一个目录中的所有文件&#xff08;包括子目录中的&#xff09;&#xff0c;拷贝到顶一个指定的目录&#xff0c;要求…

DCA1000 AWR1843 环境安装

mmWaveStudio GUI设计用于表征和评估TI Radar器械。mmWaveStudio通过SPI向mmWave设备发送命令来配置和控制mmWave设备。使用DCA 1000 EVM或TSW 1400 EVM板捕获ADC数据&#xff0c;并在Matlab中处理数据&#xff0c;结果显示在GUI中。mmWaveStudio GUI利用C DLL和一组API通过FTD…

机器学习实操项目01——Numpy入门(基本操作、数组形状操作、复制与试图、多种索引技巧、线性代数)

上一章&#xff1a;【从 0 到 1 落地】机器学习实操项目目录&#xff1a;覆盖入门到进阶&#xff0c;大学生就业 / 竞赛必备 下一章&#xff1a; 机器学习核心知识点目录&#xff1a;机器学习核心知识点目录 机器学习实战项目&#xff1a;【从 0 到 1 落地】机器学习实操项目目…

【vscode】如何离线下载vsxi插件,且在无网环境下离线安装插件-2026最新实验教程

文章目录插件市场也可以从APP进入无网环境下安装插件插件市场 https://marketplace.visualstudio.com/vscode 也可以从APP进入 这里以下载python插件为例 选择版本 无网环境下安装插件

vue2 侦听器watch

一、watch 核心作用监测数据变化&#xff1a;当被监听的数据发生改变时&#xff0c;自动执行指定的处理函数处理副作用&#xff1a;适合执行异步操作&#xff08;如接口请求&#xff09;、复杂逻辑处理等 “副作用” 代码二、基础语法&#xff08;3 种写法&#xff09;简单写法…

今天继续学习Linux系统中shell脚本

首先继续上次的内容看一下另一个案例案例&#xff1a;持续检查服务器负载uptime查看负载情况&#xff08;也可以用top命令&#xff09;[rootlocalhost ~]# uptime22:11:26 up 7:05, 3 users, load average: 0.00, 0.00, 0.00#!/bin/bash #Function:持续检查服务器负载,如果负…

Win系统下配置PCL库第一步之下载Visual Studio和Qt 5.15.2(超详细)

之前在上篇文章Win系统下配置PCL库_windows pcl库 下载-CSDN博客中提到配置PCL库的教程是下载Visual Studio和Qt 5.15.2&#xff0c;后续在测试中我发现前面这两步很重要&#xff0c;一般Qt在线下载器选项选不好的话Qt是装的Qt6&#xff0c;在VTK编译的时候Qt6往往需要C17编译&…

openCV3.0 C++ 学习笔记补充(自用 代码+注释)---持续更新 四(91-)

环境&#xff1a;OpenCV3.2.0 VS201791、合并Y方向重叠的轮廓以轮廓的最小垂直外接矩形框的y为依据&#xff0c;合并y重叠的轮廓。数学逻辑&#xff1a;几何合并的数学表达坐标系统&#xff1a;假设矩形由左上角坐标(x, y)和宽高(width, height)定义。合并公式&#xff1a;合并…

numpy数组的升维和降维的方法集锦

为适配计算包对numpy数组的维度要求&#xff0c;对numpy数组进行升维或降维转化&#xff0c;是非常常见的操作。这里尝试通过多种方式对numpy数组进行升维或降维。1 数组升维1.1 np.expand_dims在0维升维&#xff0c;示例如下a np.array([1,2,3,4,5]) np.expand_dims(a, axis0…

介绍 Python Elasticsearch Client 的 ES|QL 查询构建器

作者&#xff1a;来自 Elastic Miguel Grinberg 学习如何使用 ES|QL 查询构建器&#xff0c;这是一个新的 Python Elasticsearch client 功能&#xff0c;可以更轻松地使用熟悉的 Python 语法构建 ES|QL 查询。 想要获得 Elastic 认证吗&#xff1f;快来了解下一期 Elasticsear…

三坐标测量仪:高精度测量内径检测手段及其实际运用

在工业制造领域中&#xff0c;内径尺寸的精准度直接关系到产品的装配性能、运行稳定性乃至使用寿命。传统检测方法如卡尺、内径千分尺等难以满足高精度、复杂结构件的需求。三坐标测量仪技术的出现&#xff0c;打破了这一困境&#xff0c;成为当前工业领域实现高精度内径检测的…

DIPMARK:一种隐蔽、高效且具备鲁棒性的大语言模型水印技术

摘要水印技术为通过在数据中嵌入隐蔽信息来保障数据安全提供了一种很有前景的方法。该领域的一个首要挑战在于&#xff0c;在水印嵌入过程中保持原始数据的分布。我们的研究拓展并优化了现有的水印框架&#xff0c;着重强调了保持分布&#xff08;DiP&#xff09;水印的重要性。…

IMU传感器价格与高精度惯性导航系统供应商分析

本段将对IMU传感器价格及高精度惯性导航系统的市场情况进行概览。IMU传感器作为惯性导航的重要组成部分&#xff0c;其价格水平受到技术、需求和供应商竞争等多重因素的影响。随着无人机、自动驾驶车辆等新兴应用场景的兴起&#xff0c;IMU传感器的市场需求逐渐攀升。这不仅带动…

3-9〔OSCP ◈ 研记〕❘ WEB应用攻击▸利用REST API提权

郑重声明&#xff1a; 本文所有安全知识与技术&#xff0c;仅用于探讨、研究及学习&#xff0c;严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任&#xff0c;本人不承担任何责任。 如需转载&#xff0c;请注明出处且不得用于商业盈利。 …