是的,这个现象很正常。在银河麒麟/Linux下,Qt 的 QSerialPortInfo::availablePorts()并不是直接去"扫描硬件",而是枚举系统已经暴露出来的串口设备节点,比如:
-
/dev/ttyS*:原生串口 -
/dev/ttyUSB*:USB 转串口,如 CH340、CP210x、FTDI、PL2303 -
/dev/ttyACM*:CDC-ACM 类设备
如果内核里对应的串口驱动没有安装或没有加载,内核就不会创建这些 /dev/tty* 节点,udev 也不会生成对应设备信息,Qt 自然就识别不到。安装驱动并加载模块后,设备节点出现,Qt SerialPort 相关接口就能枚举到了。
我的设备的串口名称为ttyWCH0-3
ttyWCH0-3 这个名称直接表明你的设备使用的是沁恒(WCH)官方厂商驱动 ,而不是 Linux 内核默认的 8250_pci 通用驱动。
讲讲沁恒(WCH)
沁恒(WCH,全称WinChipHead)是一家专注于连接技术 和微处理器内核 的国产集成电路设计企业,其核心特点是坚持全栈自研IP,走了一条"先打IP地基、再建芯片高楼"的产业化路径。
南京沁恒微电子股份有限公司成立于2004年5月9日,总部位于江苏南京
之前没想到还需要再自己安装串口驱动
你这次的现象其实非常典型:
驱动没装 → 内核没创建设备节点 → Qt 枚举不到串口
驱动装好 →
/dev/ttyWCH0-3出现 → Qt 的QSerialPortInfo就能识别
问题从头到尾都不在 Qt,Qt 只是"读系统里已经存在的串口设备"。它不会去凭空发现硬件。
为什么 Linux 还要自己装串口驱动?
因为 Linux 只是把很多常见硬件的驱动内置进内核了,所以给人感觉"不用装驱动"。但遇到下面这些情况,往往还是要额外装:
-
USB 转串口:CH340、CP210x、FTDI、PL2303 等
-
PCIe/PCI 转串口卡:比如沁恒 CH382、CH384
-
多串口卡、工业串口卡
-
较新的芯片,发行版内核还没集成
-
国产系统内核版本较旧,厂商驱动没进官方源
为什么是 ttyWCH0-3 而不是 ttyS*?
你的设备是一块 PCIe 转多串口卡 ,芯片型号很可能是 CH35x 或 CH38x系列(如 CH382、CH384)。Linux 内核自带的 8250_pci 驱动也能驱动部分沁恒芯片,但会将其识别为标准的 ttyS* 设备。为了获得更好的兼容性和高级功能(如更高的波特率、硬件流控、RS485 支持等),你需要安装沁恒官方的驱动。官方驱动加载后,会主动解绑 8250_pci 驱动,并为设备创建专用的 **/dev/ttyWCH***设备节点。编号从 0 开始,你的卡有 4 个串口,所以就是 ttyWCH0 到 ttyWCH3。