Статическая привязка последовательных портов в ubuntu на Raspberry Pi

#raspberry-pi #esp32 #tty #usbserial

Вопрос:

Я запускаю настройку 4 ESP32, которые подключены к PI через последовательные соединения. Есть ли способ статически связать все ESP, чтобы порядок портов после каждой загрузки не имел значения? Он также должен быть неопределенным по идентификатору, так как я выполняю несколько аналогичных настроек, и код должен соответствовать всем. Кроме того, в случае замены я просто хочу, чтобы система знала, что на одном и том же порту находится одно и то же устройство.

Извините, если я написал это путано, но в целом я хочу, чтобы ESP можно было заменить, в то время как порт описывает функцию устройства.

Спасибо, ребята, и счастливого кодирования

Комментарии:

1. Это кажется не по теме для этого сайта. Кроме того, операционной системе на самом деле все равно, что находится на удаленном конце последовательного соединения. Это проблема прикладной программы, которую необходимо решить.

2. Вы (неправильно)используете «последовательные порты» и «последовательные соединения» для обозначения какого-то USB-адаптера???

3. ESP подключены через USB к Pi, так как они находятся в одной коробке

4. К вашему сведению, USB-это шина, которая добавляет к соединению свой собственный уровень(уровни) протокола. Подключение USB с использованием адаптеров или с помощью ADM CDC может фактически показаться «последовательным подключением» , но на самом деле оно намного сложнее (как HW, так и SW), чем использование UARTs. Вы полностью скрываете то, что у вас есть, пренебрегая упоминанием USB в любом месте.

Ответ №1:

Единственный практический подход-это идентификация, извините. USB-устройства создаются в том же порядке, в котором они инициализированы, поэтому никаких гарантий нет. Если это поможет, вот правило udev, которое создает символические ссылки из серийного номера USB-последовательного чипа Silabs, например /dev/EDK-d80d38b81e . Протестировано с помощью плат DevKitC и LOLIN32.

 # udev rules for the Espressif ESP32-DevKitC and Wemos LOLIN32 dev boards to
# allocate symlinks with fixed names for each device using its serial number.

# CP2102N/CP2104N with idVendor=10c4, idProduct=ea60
#
# Instructions:
# 1. Copy udev rules and restart daemon:
#   $ sudo ln -s "$PWD/70-cp210xn_ESP32-DevKitC.rules" /etc/udev/rules.d/ amp;amp; sudo systemctl restart udev
# 2. Disconnect and connect the board to USB

# Espressif ESP32-DevKitC with CP2102N.
# Sample serial in chip is "7063b99e4b74ea11b6f52208cf25bb41" where only first
# 10 chars seem to be unique. We cut the serial down to those and create a
# symlink from the result, e.g. "/dev/EDK-7063b99e4b"
SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{manufacturer}=="Silicon Labs", ATTRS{product}=="CP2102N USB to UART Bridge Controller",  PROGRAM="/usr/bin/awk -- 'BEGIN { print substr("$attr{serial}",1,10) }'" SYMLINK ="EDK-%c", GROUP="dialout", MODE="0660"

# Wemos LOLIN32 with CP2104N, sample serial in chip is "01DFA32C".
# We create a symlink "EDK-01DFA32C" (cropping to first 10 chars just in case).
SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{manufacturer}=="Silicon Labs", ATTRS{product}=="CP2104 USB to UART Bridge Controller",  PROGRAM="/usr/bin/awk -- 'BEGIN { print substr("$attr{serial}",1,10) }'" SYMLINK ="EDK-%c", GROUP="dialout", MODE="0660"

 

Ответ №2:

У меня была аналогичная проблема, когда мне нужно было статически привязывать физические USB-порты к устройствам, в моем случае это дешевые последовательные/USB-преобразователи, и у них нет уникального идентификатора, поэтому единственным способом их идентификации было использование сопоставления физических портов. Я решил создать правила udev с псевдонимами, как это:

 SUBSYSTEM=="tty",KERNELS=="2-2:1.0",SYMLINK ="device1"
SUBSYSTEM=="tty",KERNELS=="2-3:1.0",SYMLINK ="device2"
 

Теперь я открываю соединение с устройствами, используя символические ссылки. Таким образом, пока вы не поменяете местами разъемы, каждое устройство всегда будет иметь одну и ту же символическую ссылку.

Ответ №3:

К сожалению, Raspberry Pi (не знаю о Linux в целом) переназначает порты USB после каждой загрузки или при подключении/отключении устройств. Таким образом, номера последовательных портов меняются более или менее случайным образом. Вам нужен какой-то другой способ определить, какое устройство какое. Вероятно, лучший метод-использовать неиспользуемые контакты для идентификации устройства и запрашивать идентификатор устройства у хоста при запуске, чтобы вы знали, какой ESP32 подключен к какому порту.