Фон

Я пытаюсь подключиться к устройству с помощью UART через кабель micro-USB и GNU screen от Ubuntu и OSX.

Как в Ubuntu, так и в OSX я могу получить самое последнее последовательное соединение с помощью следующей команды, которую я запустил сразу после подключения устройства и его включения.

ls -t /dev/tty* | head -n 1

На Ubuntu я получаю (это на самом деле вывод ll и -n 3 поэтому я могу лучше видеть, что показано)

crw-rw---- 1 root dialout 166,  0 Jan 29 10:51 /dev/ttyACM0
crw-rw-rw- 1 root tty       5,  0 Jan 29 10:14 /dev/tty
crw-rw---- 1 root dialout   4, 68 Jan 21 16:19 /dev/ttyS4

и первый пункт правильный (т.е. я могу screen /dev/ttyACM0 115200).

На Mac вместо этого я получаю это

crw--w----  1 atcold  tty     16,   4 29 Jan 10:56 /dev/ttys004
crw-rw-rw-  1 root    wheel   19,  44 29 Jan 10:56 /dev/tty.usbmodemfd121
crw--w----  1 atcold  tty     16,   6 28 Jan 16:21 /dev/ttys006

и первый элемент неверен (я не могу подключиться к нему), в то время как рабочий - второй (и мне пришлось дважды выключить и включить устройство, так как в первый раз не было никакого /dev/tty.usbmodemfd121 в все).

Вопрос

Мой вопрос прост. Как я могу автоматически получить доступ к правильному последовательному соединению? Я стараюсь не создавать слишком много проблем конечному пользователю, пытающемуся решить эту проблему автоматически.

Ответ

Это мой последний сценарий :)

read -p "Connect the switched off board, then press <Enter>" temp
ls /dev/tty* > /tmp/old_tty
read -p "Turn on the board and press <Enter>" temp
ls /dev/tty* > /tmp/new_tty
screen $(comm -13 /tmp/old_tty /tmp/new_tty) 115200

2 ответа2

0

Решением может быть определение активного последовательного соединения до и после подключения микро-USB, а затем подключение к присутствующему только после подключения микро-USB. Это можно сделать, например, с помощью скрипта sh

#!/bin/sh
PATH_SUFFIX="/dev/tty"

read -p "Be sure the mini usb adapter is unplugged then press ENTER" temp
BEFORE=`ls -1 ${PATH_SUFFIX}* `
read -p "Now plug device and then press ENTER" temp
# sleep 2 seconds to be sure the filedevise is created
sleep 2
AFTER=`ls -1 ${PATH_SUFFIX}*`

OLD_IFS=$IFS

IFS='
'

for file in $AFTER ; do
    if case ${BEFORE} in *"${file}"*) false;; *) true;; esac; then
        FOUND=$file
    fi
done

IFS=$OLD_IFS

#Now do whatever with FOUND device
echo $FOUND
0

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

Предполагая, что вы можете идентифицировать устройство по поставщику или серийному номеру.

Это должно помочь:

http://noctis.de/ramblings/linux/49-howto-fixed-name-for-a-udev-device.html

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .