Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

abin-z/SerialPort

Repository files navigation

一个跨平台的C++串口库

简介

本库是一个跨平台简单的C++串口工具库, 其目的是简化串口开发

  • 简单易用, 只需注册回调即可实现异步接收数据.
  • 跨平台, 支持Windows / Linux / macOS等主流操作系统.

库文件在serial_port文件夹下

使用教程

  1. 拷贝serial_port到项目文件夹中.

  2. 在CMakeLists.txt中添加以下内容:

    add_subdirectory(serial_port) # 添加子文件夹
    add_executable(serialportDemo main.cpp) # 根据实际项目更改
    target_link_libraries(serialportDemo PRIVATE serialport) # 链接serialport
  3. 在源文件中包含头文件#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)

  • 只包含改库的includesrc文件夹

  • 简化了原来自带的CMakeLists.txt

  • 也可以直接使用原生serial库, 案例在main.cpp

About

串口通讯工具库

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

AltStyle によって変換されたページ (->オリジナル) /