Linux говорит мне, что последовательный порт используется, но это не так.

Вопрос или проблема

На 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 для создания или изменения правил. Для этого:

  1. Создайте файл, например, /etc/udev/rules.d/99-serial.rules и добавьте следующее правило:
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE="0666", GROUP="dialout"
  1. После внесения изменений перезапустите udev:
sudo udevadm control --reload

5. Заключение

Если после всех этих действий проблема не исчезла, стоит рассмотреть возможность наличия аппаратных проблем с вашим NFC-устройством или кабелем, а также проверить, корректно ли оно подключается и распознается системой. Применение этих решений поможет эффективно устранить проблемы с доступом к последовательным портам в Linux, а также обеспечит надежную работу ваших устройств.

Оцените материал
Добавить комментарий

Капча загружается...