Почему я получаю сообщение об ошибке при использовании cd в качестве служебного аргумента env?

Я не работаю с устройствами Arduino, поэтому не могу быть чем-то конкретным, но за неимением других ответов я могу попытаться дать вам несколько общих советов (для UNIX/Linux )как как решить вашу конкретную проблему.

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

Вы могли бы получить что-то полезное с такими инструментами, как expectили сопутствующая команда minicomrunscript(, которая похожа на expect), которая обычно отправляет данные по строкам.

В противном случае, в качестве еще одного, возможно, хорошего средства, вы могли бы реализовать (очень )рудиментарное -линейно-ориентированное «терминальное приложение».

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

(
set -e
prev_settings="$(stty -g -F /dev/ttyACM0)"
trap 'stty "${prev_settings}" -F /dev/ttyACM0' EXIT
stty -F /dev/ttyACM0 raw -echo -echoe -echok -echoctl -echoke
cat < /dev/ttyACM0 &
cat > /dev/ttyACM0
)

set -eпросто служит для прекращения выполнения при первой ошибке (, если какая-либо )обнаружена следующими командами.

stty -gсохраняет текущие настройки последовательного порта.

Параметр trapнастраивает восстановление сохраненных настроек при ВЫХОДЕ из команд.

stty raw...устанавливает (то, что, как мне кажется, должно быть )наиболее разумным (для данного конкретного случая )для последовательного порта.

Первая команда catпросто выводит в окно терминала все, что поступает от Arduino.

Вторая команда catотправляет в Arduino все, что вы вводите с этого момента.

Чтобы выйти из этой группы команд, просто нажмите Ctrl -C.

«Хитрость» здесь просто в том, что команда catпо своему замыслу отправляет выходные данные построчно, как вы и просили.

С другой стороны, ввод cat команда (перваяcat)сразу показывает каждый отдельный символ, поступающий от Arduino, благодаря настройке stty raw. Если Arduino отправляет потоки данных, вы можете добавить настройки min 100 time 2, которые я вижу в вашем текущем выводе stty -a. Это может отображать вещи немного быстрее в случае потоков.

Круглые скобки служат для запуска этих команд в подоболочке, что удобно для восстановления настроек tty благодаря команде trap. Вы также можете поместить команды в скрипт (, естественно, без круглых скобок ), а затем запустить его.

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

Это простое решение работает лучше всего, если ваше устройство Arduino не возвращает обратно то, что оно получает. Если это так, вы просто дважды увидите все, что вы набираете, один раз для фактического ввода и еще раз для отражения от Arduino. Дело в том, что то, что вы видите на своем терминале, не может управляться Arduino из-за установки, ориентированной на строку -. Это также можно отключить (, действуя локально, чтобы отключить отображение символов ), но я полагаю, вы предпочитаете видеть, что вы печатаете, прежде чем отправлять его в Arduino.

Последнее (и, надеюсь, не относящееся к делу )замечание: ваш последовательный порт классифицируется как ttyACM. Обычно это означает, что используемый вами последовательный порт рекламировался как поддерживающий некоторые дополнительные функции, в противном случае он был бы классифицирован системой как более общий порт ttyUSB. Быть ttyACMболее характерно для специализированных последовательных устройств (, таких как сотовые модемы 3G/4G ), чем для простых последовательных портов. Однако это может быть просто последовательный порт с дурацким чипом, и на практике это не должно вызывать особых проблем.но кто знает..

ХТХ

2
14.04.2021, 14:27
1 ответ

Поскольку cdне является " utility", это оболочка "bultin", обрабатываемая родительской оболочкой env.

Прочитать man $SHELL.

1
28.04.2021, 22:53

Теги

Похожие вопросы