推荐使用libserial库实现跨平台串口通信:它基于C++11、轻量无依赖、MIT协议,通过RAII管理资源,统一屏蔽Linux/macOS/Windows底层差异,支持链式配置与流式读写。
用 C++ 实现跨平台串口通信,核心是绕过各系统底层 API 差异,借助成熟、轻量、无依赖的第三方库——libserial(Linux/macOS)或 Windows API + 抽象封装,但更推荐统一使用 libserial 或 QSerialPort(Qt)或 asio + asio-serialport。不过最简洁实用、真正零依赖且纯 C++ 的方案是:采用 cpr + serialport(不推荐)→ 实际应选 libserial(C++11+,头文件少,MIT 协议)或 Boost.ASIO + boost::asio::serial_port(功能强但依赖 Boost)。下面以 libserial 为主给出可直接运行的跨平台实现路径。
libserial 本身原生支持 POSIX(Linux/macOS),Windows 版本需启用 Win32 后端(通过定义 SERIALPORT_WIN32 并链接 setupapi.lib)。它提供类似 iostream 的接口,无需手动处理 termios/DCB,代码干净:
sudo apt install libserial-dev(Debian/Ubuntu)或 brew install libserial
-DUSE_WINDOWS_BACKEND=ON,或用 vcpkg:vcpkg install libserial
#include ,无全局状态,RAII 管理资源libserial 屏蔽了 open() / CreateFile()、cfsetispeed() / SetCommState() 等细节。配置波特率、数据位、停止位、校验直接链式调用:
SerialStream serial_port;
serial_port.Open("/dev/ttyUSB0"); // Linux
// serial_port.Open("COM3"); // Windows(vcpkg 编译版支持)
serial_port.SetBaudRate(SerialStreamBuf::BAUD_115200);
serial_port.SetCharSize(SerialStreamBuf::CHAR_SIZE_8);
serial_port.SetParity(SerialStreamBuf::PARITY_NONE);
serial_port.SetNumOfStopBits(1);
serial_port.SetTimeout(1000); // ms,读超时
注意:Windows 下 COM 口名如 "COM3" 必须加引号;Linux 下常见 /dev/ttyUSB0、/dev/ttyACM0;macOS 为 /dev/cu.usbserial-XXXX。可用 SerialStream::GetAvailablePorts()(新版支持)枚举设备。
写入直接用 ,读取用 >> 或 read(),支持缓冲区控制和错误检查:
serial_port
std::string line; std::getline(serial_port, line);
char buf[64]; serial_port.read(buf, sizeof(buf)-1);
if (serial_port.good()) { ... };异常由 std::ios_base::failure 抛出真实场景中串口可能断开、权限不足、设备忙。不要忽略返回值和异常:
dialout 组(sudo usermod -a -G dialout $USER)Open() 并检查返回值更安全不复杂但容易忽略。