【问题标题】:User-friendly way to access serial port?访问串口的用户友好方式?
【发布时间】:2020-11-25 12:48:48
【问题描述】:

我正在编写一个应用程序,它允许通过 USB 插入的 Arduino 将串行数据发送到应用程序以实时绘制图形。它可以扫描 Arduino 的可用端口并尝试连接到它,但是无论我使用 pyserial 还是 QtSerialPort,我都遇到了权限问题。我已将我的用户添加到组 ttyuucpdialout。 (列出端口时,我看到它们属于uucp。)这似乎没有任何作用。每次插入 Arduino 时,我都可以chmod a+rw 端口,但这并不实用,因为较少的技术用户(即我的孩子)需要能够插入并通过我正在编写的 GUI 使用它。我已经看到了使用 sudo 运行整个脚本的建议,但这似乎不够安全,并且还需要在命令行中输入。

有没有一种方法可以在每次插入 USB 电缆时从串行端口读取而无需重置权限?或者,如果没有,是否有一种可接受的方式从 GUI 执行此操作,以确保在尝试连接之前权限正确,而不将 整个 程序作为 sudo 运行?我正在 Linux (Arch) 上构建它。

【问题讨论】:

  • 这能回答你的问题吗? Read/Write to a Serial Port Without Root?
  • @musicamante 不,不是真的,除非有更多我不理解的东西。我已经尝试查看ls -l /dev/ttyACM* 看到他们属于uucp 组我将我的用户添加到该组,以及ttydialout 以确保安全。没有运气。
  • 似乎有一个 old 错误(自 Qt 5.6 起似乎已解决)与权限相关,这与您应该确保QSerialPort 对象在退出前已正确关闭,否则可能会出现锁定文件无法释放的问题:请参阅stackoverflow.com/a/37402197
  • @musicamante 我会调查的。在这种情况下,我在导入 PyQt5 之前也遇到了这个权限问题,并且在仅使用 PySerial 时遇到了这个问题。
  • @musicamante 我今天也重新安装了全新的 PyQt5,所以我不认为它使用的是 3.5 年前的 Qt5 版本,尽管我不清楚如何检查正在使用的 Qt5 版本从 pip 安装 PyQt5。

标签: serial-port usb archlinux tty udev


【解决方案1】:

我使用udev rules 解决了这个问题。我创建了名为 /etc/udev/rules.d/80-arduino.rules 的规则文件,并在其中放入以下内容:

SUBSYSTEMS=="usb", ACTION=="add", DRIVERS=="usb", ATTRS{idProduct}=="0042", ATTRS{idVendor}=="2341", ATTRS{manufacturer}=="Arduino (www.arduino.cc)", ATTRS{serial}=="85734323231351404021", RUN+="/bin/arduino_added.sh", RUN+="/bin/device_added.sh", MODE="0660"

这会按序列号和制造商 (ATTRS{serial}=="85734323231351404021") 为我的特定设备选择,运行一个小脚本,将一些内容写入它在 /tmp 中创建的日志文件(用于调试),MODE="0660" 打开端口具有允许访问它的权限。

我不得不稍微弄乱它才能让它工作。运行sudo udevadm control --reload 足以让脚本在每次插入日志文件时写入日志文件,但出于某种原因,我不得不重新启动计算机以使其使用权限。

【讨论】:

    猜你喜欢
    • 2019-08-02
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 2017-08-24
    • 2018-11-01
    • 1970-01-01
    相关资源
    最近更新 更多