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 ответа:
Ниже приводятся некоторые идеи из первого ответа (я попытался добавить это содержание к этому ответу и принять его, но правки были отклонены). Я не специалист в этой области, поэтому, пожалуйста, просто используйте эту информацию для поддержки ваших собственных исследований.
Вы можете сделать одно из следующих действий:
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:
Разрешения на файл не имеют никакого значения для пользователя, что программа выполняется как
При интерактивном входе в систему у вас есть разрешение на использование файла /dev / ttyACM0
Когда ваш скрипт запущен (предположительно как пользователь apache), у него нет разрешения
Вам нужно изменить разрешения на /dev / ttyACM0
Смотрите 2-й ответ здесь Как я могу программно установить разрешения на моем устройстве char для примера изменения udev разрешения, чтобы файл имел правильные разрешения