Ubuntu18.04 中未创建 ttyUSB 串行设备

Ubuntu18.04 中未创建 ttyUSB 串行设备

我正在尝试启动并运行 USB 串行设备(GlobalSat BU-353N5 USB GPS),该设备在作为 VMWare VM 运行的 Ubuntu 18.04 PC 上运行。我已启用 USB 直通,每次运行 lsusb 后,我都可以看到设备在插入和拔出时出现和消失。

Ubuntu 18.04 VM 的内核版本为:5.4.0-84-generic

但是,当我运行 dmesg 时,它不会列出任何 ttyUSB0 设备,并且当我插入设备时它不会创建 /dev/ttyUSB0。在另一台具有类似内核版本的 ubuntu PC 上,它运行良好。

因此,当我运行我的 Python 脚本(在我的家用电脑上运行良好)时,出现此错误:

import serial
from decimal import Decimal
ser = serial.Serial('/dev/ttyUSB0',4800,timeout=5)
while 1:
    line = ser.readline().decode()
    break

脚本输出:

Traceback (most recent call last):
 File "/home/xx/.local/lib/python3.6/site-packages/serial/serialposix.py", line 322, in open
  self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
FileNotFoundError: [Errno 2] No such file or directory: '/dev/ttyUSB0'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
 File "run_gps.py", line 4, in <module>
  ser = serial.Serial('/dev/ttyUSB0',4800,timeout=5)
 File "/home/xx/.local/lib/python3.6/site-packages/serial/serialutil.py", line 244, in __init__
  self.open()
 File "/home/xx/.local/lib/python3.6/site-packages/serial/serialposix.py", line 325, in open
  raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
serial.serialutil.SerialException: [Errno 2] could not open port /dev/ttyUSB0: [Errno 2] No such file or directory: '/dev/ttyUSB0'

因此,要确保我们使用这种方法安装了正确的驱动程序(usbserial 和 pl2303):

$ apt list linux-modules-extra-5.4.0-84-generic

linux-modules-extra-5.4.0-84-generic/disco-updates,disco-security,now 5.4.0-84 amd64 [已安装,自动]

然后验证该模块是否包含在该安装包中。

$ dpkg -L linux-modules-extra-5.4.0-84-generic | grep usbserial
/lib/modules/5.4.0-84-generic-generic/kernel/drivers/usb/serial/usbserial.ko
$ dpkg -L linux-modules-extra-5.4.0-84-generic | grep pl2303
/lib/modules/5.4.0-84-generic/kernel/drivers/usb/serial/pl2303.ko

现在安装内核模块(驱动程序):

$ sudo modprobe usbserial
$ sudo modprobe pl2303

所以现在当我运行 lsmod 时,我可以看到正在使用的驱动程序。

testuser@ubuntu18:~/Documents# sudo lsmod
Module                  Size  Used by
pl2303                 24576  0
usbserial              49152  1 pl2303
rfcomm                 81920  4
binfmt_misc            24576  1
bnep                   24576  2
vmw_vsock_vmci_transport    32768  2
vsock                  36864  3 vmw_vsock_vmci_transport
intel_rapl_msr         20480  0
intel_rapl_common      24576  1 intel_rapl_msr
crct10dif_pclmul       16384  1

如何确认 USB 设备和 Linux 操作系统之间建立连接所需的所有组件均已到位,例如需要驱动程序、可能需要 udev 脚本,还是其他什么?

我看到有些人使用 /etc/udev/rules.d/ 中的文件,但我不确定我们是否需要手动修改这些文件,如果需要,如何构建一个基本脚本来测试端到端功能。

我对 Linux 不是很熟悉,所以需要帮助来尝试找出缺失和/或配置错误的地方。有时你只是不知道你不知道什么。我不是懒惰,而是完全不确定哪里坏了或丢失了。到目前为止,我已经花了近 20 个小时研究构建虚拟机并尝试各种想法,但到目前为止没有任何收获。

任何想法都值得赞赏。


更新 1

dmesg for faulty/not working PC: 
[ 272.061687] usb 2-2.2: new full-speed USB device number 5 using uhci_hcd 
[ 272.395020] usb 2-2.2: New USB device found, idVendor=067b, idProduct=23a3, bcdDevice= 1.05 
[ 272.395030] usb 2-2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 
[ 272.395092] usb 2-2.2: Product: USB-Serial Controller 
[ 272.395100] usb 2-2.2: Manufacturer: Prolific Technology Inc. 
[ 272.395104] usb 2-2.2: SerialNumber: BGDGb115819


dmesg for working PC: 
[552777.274363] usb 1-12: new full-speed USB device number 23 using xhci_hcd 
[552777.423614] usb 1-12: New USB device found, idVendor=067b, idProduct=23a3, bcdDevice= 1.05 
[552777.423620] usb 1-12: New USB device strings: Mfr=1, Product=2, SerialNumber=3 
[552777.423623] usb 1-12: Product: USB-Serial Controller 
[552777.423627] usb 1-12: Manufacturer: Prolific Technology Inc. 
[552777.423629] usb 1-12: SerialNumber: BGDGb115819 
[552777.425292] pl2303 1-12:1.0: pl2303 converter detected 
[552777.425659] usb 1-12: pl2303 converter now attached to ttyUSB0 

更新 2

Output from dmesg just now for faulty/not working PC:

[  723.726923] usb 2-2.2: new full-speed USB device number 7 using uhci_hcd
[  724.063701] usb 2-2.2: New USB device found, idVendor=067b, idProduct=23a3, bcdDevice= 1.05
[  724.063712] usb 2-2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  724.063718] usb 2-2.2: Product: USB-Serial Controller 
[  724.063723] usb 2-2.2: Manufacturer: Prolific Technology Inc. 
[  724.063727] usb 2-2.2: SerialNumber: BGDGb115819

答案1

我终于让它工作了。同意这是一个旧版本,由于供应商的产品较旧,我们受到一些限制。

解决方案是:

(1) Update to Ubuntu kernel 5.4.0-150-generic
(2) sudo apt-get update
(3) sudo apt-get install linux-modules-extra-5.4.0-150-generic

然后我插入 USB GPS 设备,它找到了它,挂载了 /dev/ttyUSB0 然后它就运行了。

看来尽管我之前运行的是 5.4.0-84-generic,但 -84 版本似乎还不足以正确处理 USB 串行。

感谢大家的帮助。

编辑 :

如果您想在 Rapsberry Pi 4 B 上运行相同的 python 代码(因为当权者可能不允许您升级 linux 内核),那么对于内核为 6.1.0-rpi7-rpi-v8 且安装了所有最新 Rapsberry Pi 4 B 更新(截至 2024 年 1 月 14 日)的 Raspberry Pi 4 B,从 Rapsberry Pi 4 B 内部安装 - 一旦您插入相同的 GlobalSat BU-353N5 USB GPS,它就会访问 ttyUSB0 端口(但请确保先安装 pyserial python 包!),然后它就可以工作了。提示 - 如果您启用 rapsberry pi 作为接入点,您将拥有一个支持 wifi 的 GPS 装置,如果有线或其他连接问题停止使用现有硬件进行 GPS 使用,它可以用于多种用途。

import serial
from decimal import Decimal

ser = serial.Serial('/dev/ttyUSB0',4800,timeout=5)

while 1:
    line = ser.readline().decode()
    print(line)
    break

相关内容