无法使用基于USB转串口芯片的USB dongle

use*_*561 25 linux usb

我有 USB Zigbee 加密狗,但无法连接到它。它短暂地出现在 中/dev/ttyUSB0,但很快就消失了。我在控制台中看到以下输出:

$ dmesg --follow
...
[  738.365561] usb 1-10: new full-speed USB device number 8 using xhci_hcd
[  738.607730] usb 1-10: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.64
[  738.607737] usb 1-10: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[  738.607739] usb 1-10: Product: USB Serial
[  738.619446] ch341 1-10:1.0: ch341-uart converter detected
[  738.633501] usb 1-10: ch341-uart converter now attached to ttyUSB0
[  738.732348] audit: type=1130 audit(1632606446.974:2212): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=brltty-device@sys-devices-pci0000:00-0000:00:01.3-0000:03:00.0-usb1-1\x2d10 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
[  738.768081] audit: type=1130 audit(1632606447.007:2213): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=brltty@-sys-devices-pci0000:00-0000:00:01.3-0000:03:00.0-usb1-1\x2d10 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
[  738.776433] usb 1-10: usbfs: interface 0 claimed by ch341 while 'brltty' sets config #1
[  738.783508] ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0
[  738.783521] ch341 1-10:1.0: device disconnected
[  739.955783] input: BRLTTY 6.4 Linux Screen Driver Keyboard as /devices/virtual/input/input35
...
Run Code Online (Sandbox Code Playgroud)

use*_*561 37

这里的问题是 BRLTTY,一个“使用可刷新盲文显示器为盲人提供对 Linux/Unix 控制台(在文本模式下)的访问”的程序。

\n

如果您没瞎,您可以通过两种不同的方式禁用 BRLTTY:

\n

删除 udev 规则

\n

BRLTTY 使用 udev 规则来获取在不成为 root 的情况下干扰 TTY 的权限。您可以通过使用以下命令覆盖发行版附带的规则来禁用这些规则/dev/null

\n
for f in /usr/lib/udev/rules.d/*brltty*.rules; do\n    sudo ln -s /dev/null "/etc/udev/rules.d/$(basename "$f")"\ndone\nsudo udevadm control --reload-rules\n
Run Code Online (Sandbox Code Playgroud)\n

禁用服务

\n

BRLTTY服务是由该brltty.path服务启动的。通过执行以下操作,可以完全阻止该服务运行:

\n
$ sudo systemctl mask brltty.path\nCreated symlink /etc/systemd/system/brltty.path \xe2\x86\x92 /dev/null.\n
Run Code Online (Sandbox Code Playgroud)\n

  • 您也可以卸载整个东西。如果您想使用任何 USB 串行设备,您可能需要清除的另一件事是“modemmanager”(它会像“命令”一样向任何串行设备发送垃圾邮件,能够混淆甚至“砖块”任何不是一种设备的设备) AT-调制解调器)。 (4认同)
  • 在我的 Manjaro 上,我禁用了所有 brltty* 服务(由自动补全列出)以使其正常工作,仅禁用 brltty.path 没有帮助。 (2认同)

小智 21

那里射击有点太多了。用户Blackisle在 ArchLinux BBS 上的这篇文章(“Arduino notworking adter update”中贡献了一个侵入性小得多的解决方案brltty

brltty有 的规则idVendor=1a86, idProduct=7523,与我的 Mega 克隆上的 CH340 串行转换器相同。

您可以通过使用lsusb获取设备列表来查看您的设备 ID(拔下 Arduino,运行,lsusb然后插入 Arduino,然后lsusb再次运行以查看出现的设备)。

就我而言:

Bus 003 Device 005: ID 1a86:7523 QinHeng Electronics CH340 serial converter
Run Code Online (Sandbox Code Playgroud)

记下 ID,然后打开 brltty 规则文件:

sudo nano /usr/lib/udev/rules.d/90-brltty-device.rules
Run Code Online (Sandbox Code Playgroud)

搜索文件,直到找到您的 ID 条目:

# Device: 1A86:7523
# Baum [NLS eReader Zoomax (20 cells)]
ENV{PRODUCT}=="1a86/7523/*", ENV{BRLTTY_BRAILLE_DRIVER}="bm", GOTO="brltty_usb_run"
Run Code Online (Sandbox Code Playgroud)

现在注释掉这一行:

# Device: 1A86:7523
# Baum [NLS eReader Zoomax (20 cells)]
# ENV{PRODUCT}=="1a86/7523/*", ENV{BRLTTY_BRAILLE_DRIVER}="bm", GOTO="brltty_usb_run"
Run Code Online (Sandbox Code Playgroud)

保存并关闭文件,然后重新启动。

重新启动后,该/dev/ttyUSB0端口在 Arduino IDE 中再次可用。

  • 这太棒了,特别是对于那些确实需要这种快速服务的人来说!附带说明一下,您可以通过运行“sudo udevadm control --reload-rules”来重新加载 udev 规则,而无需重新启动。 (8认同)
  • 侵入性较小的版本是将 90-brltty-device.rules 文件复制到“/etc/udev/rules.d/”,并在那里进行编辑。这样它就不会在以后的更新中被覆盖。 (6认同)
  • 这与重新加载 udev 规则一起,正如 @user60561 在他的评论中解释的那样,这在 Pop!_OS 22.04 (ubuntu 22.04) 上有效。 (2认同)

小智 8

这只是为了突出@EvgEnZh 的精彩评论并添加一些内容。Manjaro 上需要禁用的服务不止一项。对我来说是这样的:

列出服务:

 $ systemctl list-units | grep brltty
  brltty.path                             loaded active running   Default BRLTTY Instance
  brltty@-etc-brltty.conf.service         loaded active running   BRLTTY Instance: /etc/brltty.conf
  system-brltty.slice                     loaded active active    Slice /system/brltty
  system-brltty\x2ddevice.slice           loaded active active    Slice /system/brltty-device
Run Code Online (Sandbox Code Playgroud)

然后禁用它们:

$ sudo systemctl mask brltty.path
$ sudo systemctl stop brltty.path
$ sudo systemctl mask system-brltty\x2ddevice.slice
$ sudo systemctl stop system-brltty\x2ddevice.slice
$ sudo systemctl mask system-brltty.slice
$ sudo systemctl stop system-brltty.slice
$ sudo systemctl mask brltty@-etc-brltty.conf.service
$ sudo systemctl stop brltty@-etc-brltty.conf.service
Run Code Online (Sandbox Code Playgroud)

我不确定是否所有这些都需要被屏蔽,但仅仅屏蔽和停止 brltty.path 对我来说不起作用。