Рейтинг:2

записать на устройство и захватить ответ

флаг br

У меня есть устройство /dev/ttyACM0. Я могу «скриншотировать» на это устройство экран /dev/ttyACM0 и взаимодействовать с устройством. Мне нужно иметь возможность написать сценарий отправки простой команды и захватить ответ. Команда проста, например, введите «ver» и нажмите «Return», устройство ответит числовым значением версии. Он работает в экране.

Я пытаюсь написать это в bash и не могу понять, как заставить его работать. такие вещи, как эхо "вер" > /dev/ttyACM0 ничего не производит. Пробовал печатать, то же самое. Может ли кто-нибудь указать мне, как это сделать?

waltinator avatar
флаг it
`expect` - хороший инструмент для этого. Прочтите «человек ожидает».
jpbrain avatar
флаг ca
привет @алабаматой. У меня есть вопрос. ваше устройство является Ardunio Mega?. Arduino сбрасывается каждый раз, когда вы переключаете DTR. поэтому открытие / закрытие через bash перезагрузит ваше устройство. screen открывает соединение и не закрывает его, пока не закроет окно. Так что для этого будет легко сделать небольшую программу на языке C. Все это при условии, что у вас нет проблем с доступом "rw".
alabamatoy avatar
флаг br
@jpbrain это не Arduino, это плата ввода-вывода Numato USB. https://numato.com/product/8-channel-usb-gpio-module-with-analog-inputs/
Рейтинг:1
флаг ca

В Unix/Linux все является файлом. Каждый раз, когда вы отправляете эхо на устройство (/dev), вы открываете для записи, а затем пишете для закрытия. Простой способ поймать вывод устройства так же прост, как

tail -f /dev/ttyACM0 (-f оставляет линию открытой)

это отключит вывод и оставит устройство открытым.
Например, в моем случае у меня есть один проект, который считывает датчики в Arduino и параллельно отправляет информацию на сервер, а также на последовательный порт.

Теперь последовательные терминалы должны соответствовать скорости ОС и устройства. Поэтому иногда вы не получаете результат, если у вас нет правильной скорости и настроек. если вы наберете терминал

стти /dev/ttyACM0

вы получите текущую конфигурацию скорости.
Итак, вы можете попробовать что-то вроде этого (но не всегда работает)
обновлено ++

#!/бин/баш

input="/dev/ttyACM1" # устанавливает устройство

stty -F $input 115200 мин 0
# добавлено для инициализации строки
stty -F $input -brkint -icrnl -imaxbel -opost -onlcr -isig 
stty -F $input -icanon -iexten -echo -echoe -echok -echoctl -echoke

echo "ver" >>$input #отправить команду
tail -f $input & #reads и ждать вечно
спать 2 секунды
killall tail #Может быть проблемой, если работает другой хвост

в моем случае эта оболочка выводит это (она не будет принимать команду ver, поскольку она не реализована, но после этого читает с tty все, что отправляет tty). С изменением хвост останавливается раньше, а вывод усекается на 2 секунды.

1970-00-00-00:00:00: Инициализировать SD-карту...
1970-00-00-00:00:00: Инициализация SDCard завершена.
1970-00-00-00:00:00: Чтение конфигурации...
1970-00-00-00:00:00: Готово...
1970-01-01-00:00:01: IP-адрес: 192.168.22.199

Опять же, флаг -f держит терминал открытым, но если я сниму его, я ничего не получу (я потерял вывод буфера)

Вот почему я думаю, что небольшая программа на языке C подойдет лучше.

Надеюсь это поможет.

alabamatoy avatar
флаг br
как мне закрыть хвост после того, как он был открыт? Я тоже думаю, что небольшая программа на C может быть лучше, но это будет совершенно новый исследовательский проект для меня, поскольку C выходит за рамки моего набора навыков. Я думаю, что ваш сценарий должен дать мне много указаний по решению.
alabamatoy avatar
флаг br
Команда tail никогда не завершается, и ничего не возвращается. Мне приходится убивать процесс для команды tail. Круто то, что если я отправляю "stty -F /dev/ttyACM0 -cstopb -crtscts cs8 9600 ; echo "ver" >>/dev/ttyACM0", когда я открываю "screen /dev/ttyACM0", значение версии сидит там, так что я знаю, что разговариваю с ним, но он не может ответить сценарию.
jpbrain avatar
флаг ca
Я внесу небольшое изменение, но его нужно настроить в соответствии с вашими потребностями. Это функция автоматического убийства :-)
jpbrain avatar
флаг ca
В моем случае. Это убивает оболочку, но через некоторое время я все равно получаю еще несколько сообщений.
jpbrain avatar
флаг ca
Привет @alabamatoy. Я тестировал другой подход. Последний убивает хвост через 2 секунды.
alabamatoy avatar
флаг br
Я по-прежнему ничего не получаю от устройства с помощью команды tail. Экран работает, но не кот или хвост /dev/ttyACM0, он просто ничего не отображает.
jpbrain avatar
флаг ca
какая конфигурация экрана? если вы наберете «stty -F /dev/ttyACM0». что ты получишь?
alabamatoy avatar
флаг br
> stty -F /dev/ttyACM0 скорость 9600 бод; строка = 0; убить = ^ Н; мин = 100; время = 2; -icrnl -imaxbel -opost -onlcr -isig -icanon -эхо
jpbrain avatar
флаг ca
Привет @alabamatoy. Я провел несколько тестов. Не могу воспроизвести вашу ситуацию. Как уже было сказано, я использую Arduino и Ubuntu 20.04, используя предоставленную оболочку. Когда вы запускаете оболочку и экран, вы запускаете их отдельно в разных терминалах?
jpbrain avatar
флаг ca
Ад @alabamatoy. добавил пару строк. как я туда попал? выполнил stty на разработчике, когда он не работал, а затем снова, когда он работал. Таким образом, я поставил все, что пропало из первого. Meyabe не все нужны, но это беспроигрышный вариант.
jpbrain avatar
флаг ca
Извините... Я имел в виду привет в последнем комментарии. Я только что увидел опечатку.
Рейтинг:0
флаг it

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

В частности, если лс -л показывает, что права группы (второй "RWX"тройка) это"RW"(напр."-rw-rw----"), то добавление себя в группу, которой принадлежит устройство, предоставит RW доступ.

Вот как:

устройство="/dev/ttyACM0"
sudo adduser $USER $(stat -c "%G" $device)

Это позволяет вам стать членом группы, которая может RW устройство, но есть еще один шаг.

Чтобы сделать все ваши процессы членами новой группы, выйдите из системы и войдите в нее. Членство в группах настраивается на авторизоваться время.

Чтобы создать один процесс в новой группе (для тестирования, перед выходом/входом):

newgrp $(stat -c "%G" $устройство)  

или просто введите имя группы. Видеть человек.

alabamatoy avatar
флаг br
> ls -al /dev/ttyACM0 crw-rw---- 1 root dialout 166, 0 Sep 1 11:52 /dev/ttyACM0 Я не могу понять, как отформатировать это в stackexchange, но мне совершенно ясно, что моя проблема не в правах, особенно когда Я судо. Мне нужно знать, как захватить вывод, возвращаемый командой, отправленной на ttyACM0....
waltinator avatar
флаг it
Пожалуйста, [отредактируйте] свой пост, чтобы добавить новую информацию в правильном формате. Информацию, добавленную через комментарии, трудно форматировать для вас, трудно читать нам и игнорировать будущие читатели. Пожалуйста, нажмите [редактировать] и добавьте эту важную информацию к вашему вопросу, чтобы все факты, которые нам нужны, были в вопросе. Пожалуйста, не используйте «Добавить комментарий», так как это наша ссылка на вас. Все факты о вашей системе должны быть указаны в вопросе с [править]

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.