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:

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


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

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

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

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

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