OSError: [Errno 13] отказано в разрешении: '/ dev/ttyACM0 ' - использование pyserial от Python до Arduino


Окружающая среда

  • 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 ie:

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. разрешения для world должны быть установлены в rw ie:

sudo chmod 666 /dev/ttyACM0

02. последовательный монитор Arduino IDE должен быть открыт.

Однако эти условия не являются устойчивыми, поскольку:
  • разрешения сбрасываются при каждом подключении USB.
  • последовательный монитор Arduino IDE не должен быть открывать.
2 6

2 ответа:

Ниже приводятся некоторые идеи из первого ответа (я попытался добавить это содержание к этому ответу и принять его, но правки были отклонены). Я не специалист в этой области, поэтому, пожалуйста, просто используйте эту информацию для поддержки ваших собственных исследований.

Вы можете сделать одно из следующих действий:

01. измените разрешения на /dev/ttyACM0 так, чтобы мир имел read и write привилегии (то, что вы, возможно, не захотите делать) - хотя вы можете обнаружить, что они сбрасываются каждый раз, когда устройство подключено, например:

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"

Это также устанавливает разрешения для world to read и write, что вы можете не делать.

Для получения дополнительной информации об этом подходе см. ответы:

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-data в группу dialout:

sudo usermod -a -G dialout www-data

D) Перезагрузка.

Поскольку пользователь Apache был добавлен в группу dialout, скрипт теперь должен иметь доступ к устройству.

Далее Чтение

Как найти расположение конфигурационного файла Apache:

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

Разрешения на файл не имеют никакого значения для пользователя, что программа выполняется как

При интерактивном входе в систему у вас есть разрешение на использование файла /dev / ttyACM0

Когда ваш скрипт запущен (предположительно как пользователь apache), у него нет разрешения

Вам нужно изменить разрешения на /dev / ttyACM0

Смотрите 2-й ответ здесь Как я могу программно установить разрешения на моем устройстве char для примера изменения udev разрешения, чтобы файл имел правильные разрешения