python-2.7 - 操作系统错误 : [Errno 13] Permission denied: '/dev/ttyACM0' - using pyserial from Python to Arduino

标签 python-2.7 pyserial linux-mint arduino-uno

环境

  • Linux Mint 17.1
  • Python 2.7
  • pyserial 2.7
  • Arduino UNO rv3

  • 期望的行为

    我正在尝试从 Python 应用程序向 Arduino 发送三个值。

    从终端执行以下操作时它有效:
    $ python
    $ import serial
    $ import struct
    $ ser = serial.Serial('/dev/ttyACM0', 9600)
    $ ser.write(struct.pack('>3B', 255, 0, 0))
    

    当前行为

    在 Python 文件中使用相同的代码时它不起作用,即:
    import serial
    import struct
    ser = serial.Serial('/dev/ttyACM0', 9600)
    ser.write(struct.pack('>3B', red_value, green_value, blue_value))
    

    错误信息
    $ sudo tail -100 /var/log/apache2/error.log
    OSError: [Errno 13] Permission denied: '/dev/ttyACM0'
    

    故障排除

    权限

    申请文件:
    $ ls -l
    -rwxr-xr-x 1 myname mygroupname 114146 Jan  9 19:16 my_application.py
    

    ttyACM0:
    ls -l /dev/ttyACM0
    crw-rw---- 1 root dialout 166, 0 Jan  9 20:12 /dev/ttyACM0
    

    团体

    所有者所属的群组:
    $ groups
    mygroupname adm dialout cdrom sudo dip plugdev lpadmin sambashare
    

    由于网上的各种建议我也加了楼主到tty组通过系统设置 > 用户和组。这没有效果。

    串行端口可用
    $ dmesg | grep tty
    [    0.000000] console [tty0] enabled
    [ 3390.614686] cdc_acm 3-2:1.0: ttyACM0: USB ACM device
    

    更新

    我可以强制它在以下条件下工作:

    01. 世界的权限必须设置为 rw IE:
    sudo chmod 666 /dev/ttyACM0
    

    02. Arduino IDE 串口监视器需要打开。

    然而,这些条件是不可持续的,因为:
  • 每次连接 USB 时都会重置权限。
  • Arduino IDE 串行监视器不需要打开。
  • 最佳答案

    以下内容充实了第一个答案中的一些想法(我尝试将此内容添加到该答案中并接受它,但编辑被拒绝)。我不是该领域的专家,因此请仅使用此信息来支持您自己的研究。

    您可以执行以下操作之一:

    01. 更改 /dev/ttyACM0 上的权限使世界有readwrite特权(您可能不想做的事情)-尽管您可能会发现每次插入设备时它们都会重置,例如:

    sudo chmod 666 /dev/ttyACM0  
    

    02. /etc/udev/rules.d 中创建规则这将设置设备的权限(需要重新启动):
    # navigate to rules.d directory
    cd /etc/udev/rules.d
    #create a new rule file
    sudo touch my-newrule.rules
    # open the file
    sudo vim my-newrule.rules
    # add the following
    KERNEL=="ttyACM0", MODE="0666"
    

    这也将世界的权限设置为 readwrite ,您可能不想这样做。

    有关此方法的更多信息,请参阅以下答案:

    https://unix.stackexchange.com/a/48596/92486

    https://stackoverflow.com/a/11848003/1063287

    03. 第三个选项,是我实现的选项,将Apache用户添加到dialout组,以便如果脚本由 Apache 运行,则它可以访问设备。

    a) 找到 Apache 配置文件的位置,然后搜索 User该文件中的设置:
    # open file in editor
    sudo vim /etc/apache2/apache2.conf
    # search for User setting
    /User
    

    你可能会发现类似的东西:
    # These need to be set in /etc/apache2/envvars
    User ${APACHE_RUN_USER}
    Group ${APACHE_RUN_GROUP}
    

    b) 退出 vim 并搜索 APACHE_RUN_USER/etc/apache2/envvars (如果上述情况适用):
    # open file in editor
    sudo vim /etc/apache2/envvars
    # search for APACHE_RUN_USER
    /APACHE_RUN_USER
    

    你可能会发现类似的东西:
    export APACHE_RUN_USER=www-data
    

    c) 添加用户 www-datadialout团体:
    sudo usermod -a -G dialout www-data
    

    d) 重新开始。

    由于 Apache 用户已添加到 dialout组,脚本现在应该能够访问设备。

    延伸阅读

    如何找到 Apache 配置文件的位置:

    https://stackoverflow.com/a/12202042/1063287

    关于python-2.7 - 操作系统错误 : [Errno 13] Permission denied: '/dev/ttyACM0' - using pyserial from Python to Arduino,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27858041/

    相关文章:

    python - 从 Python 列表中有效地删除非常接近的重复项

    python - 最大 Beaglebone Black UART 波特率?

    linux - 如何在 Linux 中递归更改文件夹/文件标志?

    linux - 从 Windows 7 安装 Mint,无需 CD/笔驱动器

    python - 从字典中提取结果

    python - 缩进的 block 错误Python

    python - 奇怪的 if 语句

    python - 当出现特定字符时,开始使用 pyserial 从串行端口读取传入数据

    python - pySerial 捕获长响应

    linux - VMWare guest 无法连接到主机服务器