本库是一个跨平台简单的C++串口工具库, 其目的是简化串口开发
- 简单易用, 只需注册回调即可实现异步接收数据.
- 跨平台, 支持Windows / Linux / macOS等主流操作系统.
库文件在serial_port文件夹下
-
拷贝
serial_port到项目文件夹中. -
在CMakeLists.txt中添加以下内容:
add_subdirectory(serial_port) # 添加子文件夹 add_executable(serialportDemo main.cpp) # 根据实际项目更改 target_link_libraries(serialportDemo PRIVATE serialport) # 链接serialport
-
在源文件中包含头文件
#include "serialport/serialport.h"即可使用.
该案例在main2.cpp中
#include <fstream>
#include <iostream>
#include "serialport/serialport.h"
int main()
{
// 列出所有可用的串口, 这个接口不是很全面, 仅供参考
std::vector<serial::PortInfo> ports = SerialPort::listPorts();
if (ports.empty())
{
std::cout << "No serial ports found." << std::endl;
return 0;
}
std::cout << "Available serial ports:" << std::endl;
for (const auto& port : ports)
{
std::cout << "Port: " << port.port << " | Description: " << port.description
<< " | Hardware ID: " << port.hardware_id << std::endl;
}
// // 根据操作系统选择串口名称
// std::string port_name;
// #if defined(_WIN32) || defined(_WIN64)
// port_name = "COM5"; // Windows 示例
// #else
// port_name = "/dev/ttyS000"; // Linux 示例
// #endif
// 让用户输入串口号
std::string port_name;
std::cout << "Enter the serial port name to use (e.g., COM5 or /dev/ttyUSB0): ";
std::getline(std::cin, port_name);
// 打开文件用于记录数据
std::ofstream log_file("serial_log.txt", std::ios::out | std::ios::app);
if (!log_file.is_open())
{
std::cerr << "Failed to open log file!" << std::endl;
return 1;
}
// 创建串口对象
SerialPort sp;
// 配置串口参数并注册回调 (回调函数在独立线程中调用)
sp.setPort(port_name)
.setBaudRate(115200)
.setTimeout(10) // 读超时 10ms
.setReconnectLimit(3) // 最大重连 3 次
.setLogCallback([](SerialPort::LogLevel level, const std::string& msg) { // 日志回调
std::string levelStr;
switch (level)
{
case SerialPort::LogLevel::Info:
levelStr = "[INFO] ";
break;
case SerialPort::LogLevel::Warning:
levelStr = "[WARN] ";
break;
case SerialPort::LogLevel::Error:
levelStr = "[ERROR] ";
break;
}
std::cout << levelStr << msg << std::endl;
})
.setDataCallback([&log_file](const std::string& data) {
for (unsigned char c : data)
{
log_file << std::hex << std::uppercase << (int)c << " ";
}
log_file.flush(); // 保证立即写入文件
log_file << std::dec << std::endl; // 每条数据换行,并恢复十进制格式
});
// 打开串口
if (!sp.open())
{
std::cerr << "Failed to open serial port" << std::endl;
return 1;
}
std::cout << "Serial port opened. Type messages to send. Type 'exit' to quit.\n";
// 循环读取用户输入并发送
std::string line;
while (true)
{
std::cout << "> ";
std::getline(std::cin, line);
if (line == "exit") break;
sp.write(line + "\r\n"); // 发送回车换行,可按需要调整
}
// 关闭串口
sp.close();
return 0;
}控制台运行结果:
PS ***\SerialPort\build_output\bin> .\serialportTest.exe
Available serial ports:
Port: COM1 | Description: Electronic Team Virtual Serial Port (COM1->COM2) | Hardware ID: EVSERIAL9
Port: COM2 | Description: Electronic Team Virtual Serial Port (COM2->COM1) | Hardware ID: EVSERIAL9
Enter the serial port name to use (e.g., COM5 or /dev/ttyUSB0): COM1
[INFO] [COM1@115200] SerialPort opened
Serial port opened. Type messages to send. Type 'exit' to quit.
> hello world
> hello serialport
> exit
[INFO] [COM1@115200] SerialPort closed
PS ***\SerialPort\build_output\bin> 串口调试工具截图:
输出文件serial_log.txt内容:
57 65 6C 63 6F 6D 65 20 74 6F 20 55 61 72 74 41 73 73 69 73 74
AA BB CC DD EE FF 本库使用了这个三方库: serial
-
该库跨平台,足够轻量且稳定, 已在大量知名项目中使用(如ROS)
-
只包含改库的
include和src文件夹 -
简化了原来自带的CMakeLists.txt
-
也可以直接使用原生serial库, 案例在main.cpp中
