使用Python的pySerial库,通过编程接口访问串口需指定端口名(如COM3/dev/ttyS0),确保系统权限及设备连接正常
API 获取串口信息详解
串口基础概念
串口(Serial Port)是计算机与其他设备通信的接口,常见的包括:

- COM口(Windows系统,如
COM1、COM2) - TTY设备(Linux系统,如
/dev/ttyS0、/dev/ttyUSB0) - USB转串口设备(虚拟端口,如
/dev/cu.usbserial)
操作系统差异
| 操作系统 | 串口命名规则 | 权限要求 | API调用方式 |
|---|---|---|---|
| Windows | COM1~COM256 |
管理员权限(部分操作) | Win32 API (CreateFile) |
| Linux | /dev/ttyS0~/dev/ttyS7 |
Root权限或拨号权限组 | open()系统调用 |
| macOS | /dev/tty.usbserial |
Root权限或diawusb组 |
I/O Kit 或 open() |
API 获取串口列表
Windows 系统
方法:枚举注册表键值
// C++ 示例:获取所有物理串口
HKEY hKey;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\DEVICEMAP\SERIALCOMM", 0, KEY_READ, &hKey);
char buffer[256];
DWORD index = 0;
while (RegEnumValue(hKey, index, buffer, sizeof(buffer), NULL, NULL) == ERROR_SUCCESS) {
// buffer格式:"SerialCommCOMX"
std::string portName(buffer + 13); // 提取COMX部分
std::cout << "Found port: " << portName << std::endl;
index++;
}
RegCloseKey(hKey);
Linux 系统
方法:遍历/dev目录
# Python 示例:获取所有串口设备
import os
def list_serial_ports():
ports = []
for device in os.listdir("/dev"):
if "tty" in device and ("S" in device or "USB" in device):
ports.append(f"/dev/{device}")
return ports
print(list_serial_ports())
跨平台方案
| 库/框架 | 语言 | 特点 |
|---|---|---|
| pySerial | Python | 自动检测所有可用串口 |
| QtSerialPort | C++/Qt | 集成于Qt框架,跨平台支持 |
| Node-Serial | JavaScript | 基于Node.js的串口通信库 |
核心API对比表
| 功能 | Windows API | Linux API | Python (pySerial) |
|---|---|---|---|
| 打开串口 | CreateFile() |
open() |
serial.Serial() |
| 配置波特率 | SetCommState() |
tcflush()+cfsetispeed() |
ser.baudrate |
| 读写数据 | ReadFile()/WriteFile() |
read()/write() |
ser.read()/ser.write() |
| 关闭串口 | CloseHandle() |
close() |
ser.close() |
完整示例(Python pySerial)
import serial
import serial.tools.list_ports
# 列出所有可用串口
ports = serial.tools.list_ports.comports()
for port in ports:
print(f"Port: {port.device}, Description: {port.description}")
# 打开指定串口
ser = serial.Serial(port='COM3', baudrate=9600, timeout=1)
ser.write(b'Hello Serial')
response = ser.read(10)
print(f"Received: {response}")
ser.close()
常见问题与解答
问题1:为什么Linux下访问/dev/ttyS0提示Permission denied?
解答:
Linux系统对串口设备有严格的权限控制,需通过以下方式解决:
- 使用
sudo提权运行程序 - 将当前用户加入
dialout组:sudo usermod -a -G dialout $USER
- 修改设备权限(临时方案,不推荐):
sudo chmod 666 /dev/ttyS0
问题2:如何判断串口是否被其他程序占用?
解答:

- Windows:检查
CreateFile()返回ERROR_ACCESS_DENIED - Linux:尝试
open()会返回EBUSY错误 - 通用方法:
- 在代码中捕获异常(如Python的
try-except) - 使用系统工具查看进程占用:
- Windows:
handle.exe命令 - Linux:
lsof | grep ttyS0
- Windows:
- 在代码中捕获异常(如Python的
扩展知识
| 场景 | 解决方案 |
|---|---|
| 虚拟串口创建 | Windows: CreateFile()指定GENERIC_READ|GENERIC_WRITELinux: socat命令 |
| 串口数据监听 | 使用select()多路复用或事件驱动库(如Python的pyserial异步模式) |
| 跨操作系统兼容 | 使用跨平台库(如Qt、libserialport)或封装系统调用层 |
到此,以上就是小编对于“api 获取串口”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!