解决 Ubuntu 下 USB 报警器串口权限问题

问题描述

在 Ubuntu 20.04 上使用 USB 报警器(CH340 串口设备)时,遇到了以下问题:

  1. 通过 cutecom 发送指令无响应,可能与权限有关。
  2. 直接使用 echo 发送指令:
    echo -ne "\x7E\xFF\x06\x01\x02\x00\x00\xEF" > /dev/ttyUSB0
    
    报错:bash:/dev/ttyUSB0:权限不够
  3. 使用 sudo 可以成功发送指令:
    echo -ne "\x7E\xFF\x06\xC2\x00\x00\x05\xEF" | sudo tee /dev/ttyUSB0 > /dev/null
    
    每次开机后,第一次执行需要输入密码,影响自动化操作。

解决方案

1. 让 sudo 执行特定命令时免密码(最终选择)

步骤 1:修改 sudoers 文件

运行以下命令:

sudo visudo

在文件底部添加:

yourusername ALL=(ALL) NOPASSWD: /usr/bin/tee /dev/ttyUSB0, /bin/chmod 666 /dev/ttyUSB0

注意

  • yourusername 替换为你的实际用户名(可通过 whoami 获取)。
  • 这样,每次运行 sudo tee /dev/ttyUSB0sudo chmod 666 /dev/ttyUSB0不会再要求输入密码
步骤 2:测试

执行以下命令,不应再要求输入密码:

sudo chmod 666 /dev/ttyUSB0
echo -ne "\x7E\xFF\x06\xC2\x00\x00\x05\xEF" | sudo tee /dev/ttyUSB0 > /dev/null

2. (可选)开机自动赋予 /dev/ttyUSB0 读写权限

如果希望 彻底无需 sudo,可以让 /dev/ttyUSB0 在开机时自动拥有 666 权限。

方法 1:使用 udev 规则(推荐)

创建 udev 规则,确保设备 /dev/ttyUSB0 自动获得 666 权限。

步骤 1:创建规则文件

sudo nano /etc/udev/rules.d/99-usb-serial.rules

添加以下内容:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0666"

注意

  • idVendoridProduct 需要与你的设备匹配,可用 lsusb 查看。
  • 例如,执行 lsusb 后,可能得到:
    Bus 001 Device 003: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
    
    idVendor="1a86"idProduct="7523"

步骤 2:应用规则

sudo udevadm control --reload-rules
sudo udevadm trigger

步骤 3:重新插拔 USB 设备或重启系统/dev/ttyUSB0 现在应自动获得 666 权限。

方法 2:将用户加入 dialout 组(适用于所有串口设备)
sudo usermod -a -G dialout $USER
newgrp dialout

注销并重新登录,使更改生效。之后 /dev/ttyUSB0 可以直接访问,不再需要 sudo


总结

方案适用情况备注
修改 sudoers(最终方案)只想省去 sudo 密码,仍用 sudo 执行最快见效,适用于少量命令
udev 规则彻底自动化,无需 sudo推荐,适用于 固定 USB 设备
dialout适用于 所有串口设备适合多设备管理,但需重新登录

最终,我选择了修改 sudoers 文件,使得 sudo tee /dev/ttyUSB0 不再需要输入密码,从而提升了使用效率。 🎉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值