使用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_WRITE Linux: socat 命令 |
串口数据监听 | 使用select() 多路复用或事件驱动库(如Python的pyserial 异步模式) |
跨操作系统兼容 | 使用跨平台库(如Qt、libserialport)或封装系统调用层 |
到此,以上就是小编对于“api 获取串口”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复