0

0

c++怎么读取串口数据_c++ serial库通信配置与字节流处理【实战】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-12-26 16:23:44

|

888人浏览过

|

来源于php中文网

原创

最稳的跨平台串口方案是boost::asio::serial_port,需显式设置波特率、数据位、停止位、校验和流控;推荐异步读取并注意缓冲区生命周期与二进制数据十六进制打印。

c++怎么读取串口数据_c++ serial库通信配置与字节流处理【实战】

Windows 下用 SerialPort 类(.NET)或 CreateFile+ReadFile 是可行的,但跨平台项目基本得靠第三方库;Linux/macOS 没有统一串口类,直接操作 /dev/ttyUSB0 文件描述符又容易出错。最稳的选择是 libserialserialport(C++ 封装版),但前者已多年未更新,后者依赖 Node.js。实际项目中,boost::asio::serial_port 是目前最可靠、可移植、文档清晰的方案。

用 boost::asio::serial_port 打开串口并设置参数

必须显式指定波特率、数据位、停止位、校验方式——漏设一项就可能收不到数据。默认不启用硬件流控,多数嵌入式设备也不需要,但若对方启用了 RTS/CTS,set_option 必须补上对应选项。

  • baud_rate:常见值如 9600115200,需与设备严格一致
  • character_size:通常为 asio::serial_port_base::character_size(8)
  • stop_bits:多数设备用 asio::serial_port_base::stop_bits::one
  • parity:无校验时用 asio::serial_port_base::parity::none
  • flow_control:除非设备手册明确要求,否则保持 asio::serial_port_base::flow_control::none
boost::asio::io_context io;
boost::asio::serial_port port(io, "/dev/ttyUSB0"); // Windows 用 "\\.\COM3"
port.set_option(boost::asio::serial_port_base::baud_rate(115200));
port.set_option(boost::asio::serial_port_base::character_size(8));
port.set_option(boost::asio::serial_port_base::stop_bits(
    boost::asio::serial_port_base::stop_bits::one));
port.set_option(boost::asio::serial_port_base::parity(
    boost::asio::serial_port_base::parity::none));
port.set_option(boost::asio::serial_port_base::flow_control(
    boost::asio::serial_port_base::flow_control::none));

阻塞读取 vs 异步读取:别在主线程里用 read_some 等死

串口数据到达不可预测,用 read_some 阻塞等待会导致整个线程卡住;而 async_read_some 配合 io_context::run() 是标准做法。注意:回调函数里不能直接用 std::cout 打印二进制数据——非 ASCII 字节会破坏终端显示,应转为十六进制输出。

Unscreen
Unscreen

AI智能视频背景移除工具

下载
  • 阻塞读取仅适合调试单次命令响应(如发 AT 指令后等 OK)
  • 异步读取必须保证 io_context 生命周期长于 port,且缓冲区(std::vector<uint8_t></uint8_t>)不能是变量
  • 每次 async_read_some 最多只读到当前内核缓冲区里的可用字节,不是“一帧”,需自行组包
std::vector<uint8_t> rx_buf(1024);
port.async_read_some(boost::asio::buffer(rx_buf),
    [&](const boost::system::error_code& ec, size_t len) {
        if (!ec) {
            printf("recv %zu bytes: ", len);
            for (size_t i = 0; i < len; ++i) {
                printf("%02x ", rx_buf[i]);
            }
            printf("
");
        }
    });

处理粘包和空字节:串口没有消息边界

串口是字节流设备,read_some 可能一次读到半帧,也可能把两帧合并返回。不能假设“每次回调就是一条完整指令”。常见做法是加帧头(如 0xAA 0x55)、长度字段、校验和,或用超时判断帧尾(如 10ms 内无新数据则认为一帧结束)。

立即学习C++免费学习笔记(深入)”;

  • 避免用 std::string 存原始数据——含 会被截断
  • std::vector<uint8_t></uint8_t>std::span<const uint8_t></const>(C++20)管理接收缓冲区
  • 维护一个滚动接收 buffer,每次新数据追加进去,再扫描帧头+长度字段提取完整帧
  • 记得清空已处理部分,别让 buffer 越滚越大

真正难的不是打开串口,而是怎么定义帧格式、怎么应对丢字节、怎么在多线程环境下安全共享接收结果。这些逻辑不在 boost::asio 范围内,得自己补全。尤其要注意:Linux 下 /dev/ttyUSB0 权限不对会直接 open 失败,Windows 下 COM 口被占用时报错是 Access is denied,不是设备不存在。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

377

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

32

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

29

2026.01.21

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.5万人学习

Git 教程
Git 教程

共21课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号