我正在编写一个应用程序,该应用程序允许通过USB插入的Arduino向应用程序发送串行数据,以便实时绘制图形。它可以扫描Arduino的可用端口并尝试连接到它,但无论我使用pyserial还是QtSerialPort,我都会遇到权限问题。我已将我的用户添加到组tty
、uucp
和dialout
中。(在列出端口时,我看到它们属于uucp
。(这似乎没有任何作用。每次插入Arduino时,我都可以chmod a+rw
端口,但这并不实用,因为技术含量较低的用户(即我的孩子(需要能够插入并通过我正在编写的GUI使用它。我看到了用sudo运行整个脚本的建议,但这似乎不如它需要的安全,而且还需要在命令行中键入。
有没有一种方法可以在每次插入USB电缆时从串行端口读取而无需重置权限?或者,如果没有,是否有一种可接受的方法可以在GUI中执行此操作,以确保在尝试连接之前权限正确,而无需将整个程序作为sudo运行?我正在Linux(Arch(上构建这个。顺便说一句,
我使用udev规则解决了这个问题。我创建了规则文件,称之为/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
就足以让脚本写入日志文件,但由于某种原因,我不得不重新启动计算机才能使用权限。