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. разрешения для мира должны быть установлены в rw
ie:
sudo chmod 666 /dev/ttyACM0
02. Arduino IDE последовательный монитор должен быть открыт.
однако эти условия не являются устойчивыми, как:
- разрешения сбрасываются при каждом подключении USB.
- последовательный монитор Arduino IDE не должен быть открыт.
2 ответов
ниже приведены некоторые из идей в первом ответе (я попытался добавить это содержание к этому ответу и принять его, но изменения были отклонены). Я не эксперт в этой области, поэтому, пожалуйста, просто используйте эту информацию для поддержки своих собственных исследований.
вы можете выполнить одно из следующих действий:
01. изменить разрешения /dev/ttyACM0
так что мир read
и write
priviliges (то, что вы, возможно, не хотите делать) - хотя вы можете найти они сбрасываются каждый раз, когда устройство подключено, например:
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"
это также устанавливает разрешения для мира read
и write
, что вы, возможно, не захотите делать.
дополнительные сведения об этом подходе см. В этих ответы:
https://unix.stackexchange.com/a/48596/92486
https://stackoverflow.com/a/11848003/1063287
03. третий вариант, который я реализовал, добавляет пользователя Apache в dialout
группа, так что если скрипт запускается Apache, то он может получить доступ к устройству.
a) найти местоположение файл Apache config, то искать 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
group, скрипт теперь должен иметь доступ к устройству.
Более Дальнеишее Чтение
как найти расположение конфигурационного файла Apache:
разрешения на файл не имеют никакого значения для пользователя, что программа работает как
при интерактивном входе в систему у вас есть разрешение на использование /dev / ttyACM0
когда ваш скрипт запущен (предположительно, как пользователь apache), у него нет разрешения
вам нужно изменить разрешения на /dev / ttyACM0
см. 2-й ответ здесь как я могу программно установить разрешения на моем устройстве char для пример изменения разрешений udev, чтобы файл имел правильные разрешения