Вопрос или проблема
На CrunchBang linux (вариант Debian) у меня есть COM-порт на ttyS0
, который я пытаюсь использовать с NFC-устройством. libnfc ответила, что не видит никаких NFC-устройств, поэтому я попробовал напрямую открыть COM-порт. Для этого я использовал:
sudo cu -l /dev/ttyS0 -s 9600
Однако эта команда возвращает:
cu: open (/dev/ttyS0): Permission denied
cu: /dev/ttyS0: Line in use
Я не знаю, что может использовать это соединение. Чтобы выяснить это, я попытался просмотреть все открытые процессы и отфильтровать их по использованию ttyS0
:
ps -ef | grep tty
но для этой команды ничего не отображается, что использует ttyS0
. Я также попытался получить все открытые файлы и отфильтровать по блокировке на ttyS0
:
lsof | grep tty
но это ничего не возвращает, используя ttyS0
.
Как это возможно, что cu
говорит, что линия используется, а обе команды ps
и lsof
не показывают никакого использования этой линии?
Возможно, никакого реального использования линии нет, а есть проблема с разрешениями. Быстрым и грязным способом для меня было выполнить:
ls -la /dev/ttyUSB0
sudo chmod 666 /dev/ttyUSB0
и повторить попытку с cu
. Если это начнет работать, вам нужно будет позаботиться о соответствующем файле udev
и о разрешениях/группах пользователей. Для моего устройства это выглядело так (являясь членом группы plugdev
):
> cat /etc/udev/rules.d/42-CP210x.rules
ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SUBSYSTEMS=="usb",
ACTION=="add", MODE="0666", GROUP="plugdev"
Привилегии для последовательных устройств предоставляются членам группы dialout
. Чтобы подключиться к /dev/ttyS0
, я добавил текущего пользователя в группу, используя:
sudo adduser <username> dialout
Похоже, это ошибка в cu
. Я решил эту проблему, изменив группу владельца /dev/ttyUSB0
с помощью следующей команды:
chown root:root /dev/ttyUSB0
Добавьте вашего пользователя в группу dialout
. В зависимости от системы может также потребоваться добавить вашего пользователя в группу uucp
.
Проверьте группу на членство:
getent group dialout
Или проверьте вашего пользователя:
groups `whoami`
Добавьте вашего пользователя, если это необходимо:
usermod -aG dialout `whoami`
проверьте с помощью getent
, как упоминалось выше.
Как другие отмечают, это проблема с разрешениями. Интересно, что даже запуск cu
с sudo
не кажется, что преодолевает это ограничение.
Чистое решение для большинства случаев использования — проверить разрешения, выполнив ls -la /dev/ttyUSB0
. Это должно дать вам что-то вроде следующего:
crw-rw---- 1 root dialout 188, 0 Nov 2 18:33 /dev/ttyUSB0
Добавьте вашего пользователя в группу, указанную здесь (dialout
, но может различаться на разных дистрибутивах), заменив USERNAME на имя пользователя, которому нужно предоставить доступ:
usermod -a -G dialout USERNAME
Это вступит в силу при следующем входе.
Пользователи, включенные таким образом, вероятно, смогут подключаться к любому последовательному устройству в системе, так как у всех них может быть установлена одна и та же группа (выполните ls -la /dev/tty*
, чтобы выяснить). Если это не требуется, вам нужно создать новую группу для этого интерфейса и изменить правила в /etc/udev/rules.d
, чтобы назначить эту группу последовательному порту.
Ответ или решение
На CrunchBang Linux (дистрибутив на базе Debian) зачастую можно столкнуться с проблемами доступа к последовательным портам, такими как ttyS0
. Когда вы пытаетесь использовать последовательный порт, например, с NFC-устройством, и получаете сообщение об ошибке, указывающее, что порт занят, хотя это не так, это может быть вызвано несколькими факторами.
1. Ошибка доступа: Разрешения и Управление группами
Первое, что стоит проверить — это права доступа к устройству. Для того, чтобы обеспечить правильный доступ к последовательному порту, необходимо быть членом определенной группы. В большинстве случаев, для доступа к ttyS0
требуется принадлежность к группе dialout
. Вот шаги, которые помогут вам решить проблему:
Проверьте права доступа к устройству
Выполните команду:
ls -la /dev/ttyS0
Вы должны получить информацию о правах доступа к устройству. Правильные права могут выглядеть примерно так:
crw-rw---- 1 root dialout 4, 64 Nov 2 18:33 /dev/ttyS0
Добавление пользователя в группу
Если ваша учетная запись не входит в группу dialout
, добавьте её с помощью следующей команды:
sudo adduser <ваш_логин> dialout
После выполнения этой команды вам потребуется выйти из системы и войти снова, чтобы изменения вступили в силу.
2. Проверка наличия процессов
Хотя вы уже пробовали фильтровать процессы с помощью команды ps
и lsof
, важно убедиться, что никаких других процессов, возможно, не использующих порт, нет. Попробуйте выполнить:
sudo fuser /dev/ttyS0
Эта команда покажет, если какие-либо запущенные процессы используют данный порт. Если команда вернет идентификаторы процессов, необходимо завершить их.
3. Установите правильное разрешение для порта
Если вы установили разрешения на устройство неправильно, это также может привести к проблемам. Убедитесь, что пользователь имеет достаточные права. Примените следующую команду для установки разрешений:
sudo chmod 666 /dev/ttyS0
4. Настройка правил udev
Если вы хотите управлять разрешениями для устройств более тонко, вы можете использовать udev
для создания или изменения правил. Для этого:
- Создайте файл, например,
/etc/udev/rules.d/99-serial.rules
и добавьте следующее правило:
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE="0666", GROUP="dialout"
- После внесения изменений перезапустите
udev
:
sudo udevadm control --reload
5. Заключение
Если после всех этих действий проблема не исчезла, стоит рассмотреть возможность наличия аппаратных проблем с вашим NFC-устройством или кабелем, а также проверить, корректно ли оно подключается и распознается системой. Применение этих решений поможет эффективно устранить проблемы с доступом к последовательным портам в Linux, а также обеспечит надежную работу ваших устройств.