我正在尝试启动并运行 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