Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: COM порт в bash скрипте, отправка - получение данных.  (Прочитано 10244 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Schneider

  • Автор темы
  • Участник
  • *
  • Сообщений: 173
    • Просмотр профиля
Есть железка к которой в интерактивном режиме я спокойно подключаюсь через minicom по /dev/ttyS0
и в консоле minicom пишу команды и получаю ответы.
 Теперь мне надо, чтобы в скрипте bash отправить запрос на этот com-порт и получить ответ.

minicom настроен так  9600 8N1 | NOR


sudo stty -a -F /dev/ttyS0
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 5;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

если открыть два окна терминала одновременно и в одном набрать

sudo cp test > /dev/ttyS0 # где test - файл со строкой команды заканчивающейся переходом на новую строку.

в другом

sudo cat /dev/ttyS0

то во второе окно вывалиться ответ на команду из файла test.

Но ! второе окно так и продолжит висеть пока не нажмешь Ctrl -C , а вывод кстати содержит много лишнего и не обрабатывается grep должным образом.

show Address IP4Address InterfaceAddresses/wan_ip
.E

.EThis object is updated from Ethernet "wan".

.E

.E              Property  Value                       Remarks

.E ---------------------  --------------------------  --------------------

.E                 Name:  wan_ip

.E              Address:  0.0.0.0

.E        ActiveAddress:  92.29.232.175               Dynamically assigned

.E       UserAuthGroups:  <empty>

.E NoDefinedCredentials:  No

.E             Comments:  IPAddress of interface wan

.EDFL-210:/> .[?25l.[?25h


Я что-то потерялся. Информации в интернете много, а конкретного решения для моего случая никак не найду.
Как мне данные в bash-скрипте получить с этого ком-порта?

PS. sudo echo и sudo printf не хотят работать на отправку данных в COM порт почему-то
хотя в интернете полно советов на эту тему.

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Попробуй while read -r line; do echo $line ; done </dev/ttyS0
sudo echo и sudo printf не хотят работать
Тебе нужна переадресация вывода, а sudo это не делает. Поэтому и используют для таких целей конструкции типа echo "команда" | sudo tee /dev/ttyS0 >/dev/null
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Schneider

  • Автор темы
  • Участник
  • *
  • Сообщений: 173
    • Просмотр профиля
Спасибо, задали направление. А то я что-то вокруг ком-порта ходил, выбирая че же его читать, когда мне достаточно к нему обращаться как к файлу.
Только есть одна проблемка. этот файл не имеет конца.

(Нажмите, чтобы показать/скрыть)

(Нажмите, чтобы показать/скрыть)

как видите пока CTRL-C не нажмешь продолжает что-то вылезать не останавливаясь.
Мне не понятно вот еще что. файл-устройство открыт на чтение, тогда почему оттуда лезет Unknown command?
получается то, что вывела на экран команда echo каким то образом попадает опять в устройство, и оно
пытается эти строки исполнить. как такое возможно?
« Последнее редактирование: 18 Марта 2017, 09:36:43 от Schneider »

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
cu
man cu
Wars ~.o

Оффлайн Schneider

  • Автор темы
  • Участник
  • *
  • Сообщений: 173
    • Просмотр профиля
cu
думал и так сделать, если не получиться первый вариант займусь cu

Тебе нужна переадресация вывода, а sudo это не делает. Поэтому и используют для таких целей конструкции типа
Код: [Выделить]
echo "команда" | sudo tee /dev/ttyS0 >/dev/null

эту беду я обошел запуская из под root заведомо в него войдя.
но сейчас столкнулся с другой странностью.
перестало работать то, что я показал в третьем сообщении.
просто пусто на экране и все...... я фшоке..... :-\

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
проблемка. этот файл не имеет конца
Так что надо: оборвать вывод? Ну так ограничь или количиеством строк или каким либо символом:echo -e "show Address IP4Address InterfaceAddresses/wan_ip\r" > /dev/ttyS0
while read -r line
do
    if echo $line | grep -q 'DFL-210:\/>'
    then
        exit 0
    fi
    echo "${line%\r}"
done </dev/ttyS0
А вообще впечатление что Вы как-то не так работаете с самой железкой. Или порт не тот, или команды ещё какой-то спецсимвол окончания должны иметь (например виндовый перевод строки «\r»)
« Последнее редактирование: 18 Марта 2017, 11:51:55 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Schneider

  • Автор темы
  • Участник
  • *
  • Сообщений: 173
    • Просмотр профиля
ещё какой-то спецсимвол окончания
echo в конце сама добавляет перевод строки, так что \r или \n ни к чему.
Вывод возвращается в форме строк в конце которых идут символы с кодами 0D 1B 45 это перевод строки, ESC и буква Е соответственно, почему так читает read не пойму. Потому что в minicom все без этой мешуры срабатывает.
Теперь другой вопрос вам.
А вы не разжуёте мне. Я никак в толк не возьму что это за line ?
вроде встроенная команда читающая строку на STDIN до символа перевод строки, это я вычитал
а как тогда  $line понимать?
 Поправьте мои мысли.
в цикле while do команда read -r (raw данные, т.е. игнорирует спецсимволы и символы перевода строки)
читает данные из устройства /dev/ttyS0 и передает их переменной line ? (но line подсвечивается как например команда echo в MCeditor !!!)
потом делается do echo $line и содержимое переменной вываливается в вывод на экран если скрипт запущен в консоле.
И так далее построчно пока не закончится файл, а он у нас не заканчивается .... ))) но как выйти из этого я вроде уже догадался.

Так line в данном случае команда или переменная???

Пользователь добавил сообщение 18 Марта 2017, 15:23:37:
Так line в данном случае команда или переменная???
это просто переменная, переименовав её в lin ничего не изменилось, так же работает.
у меня прогресс
(Нажмите, чтобы показать/скрыть)
сработал и таки выдал мне
заветную строку с IP адресом.
код то работает. Но глюк тот (см выше) который связан с тем, что в вывод который
выдает железка, как я говорил ранее, попадает ей на опять вход как команды,
а так как скорость 9600 всего, то происходит это ооочень мендленно, и когда я в течении пяти секунд
успеваю подключиться по minicom после отработки скрипта, я вижу как валяться эти команды последние  несколько секунд.
Как же это так получается????
если запускать скрипт повторно раньше чем весь этот мусор успеет обработать железка, то все перемешиватся
и процесс висит не давая разультат, на что я наткнулся ранее.
А если запустить повторно попозже, то все отрабатывает норм. Можно конечно так оставить, железке это не повредит, но как то криво получается.
Интересно это фича железки или в скрипте моем что то заложено не так?

PS. железка DLINK Firewall dfl210 и если она перезагружается то выдает на com порт данные сама (без скиптов)
при этом эту инфу она за свои команды не воспринимает, даже если к порту ничего не подключено.

« Последнее редактирование: 18 Марта 2017, 15:25:13 от Schneider »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
echo в конце сама добавляет перевод строки, так что \r или \n ни к чему.
«Если Вы такой умный, почему строем не ходите?» Команда echo добавляет линуксовый перевод строки (\n), а виндовый, который зачастую ждут telnet-ы и minicom-ы — это 2 символа \r\n.
вывод который
выдает железка, как я говорил ранее, попадает ей на опять вход как команды
Я уже ответил
Или порт не тот, или команды ещё какой-то спецсимвол окончания должны иметь
вывод который
выдает железка, как я говорил ранее, попадает ей на опять вход как команды
Попробовать вывод в stderrecho -e "show Address IP4Address InterfaceAddresses/wan_ip\r" >/dev/ttyS0
grep -m 1 'Active' </dev/ttyS0 >&2 && exit 0
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Schneider

  • Автор темы
  • Участник
  • *
  • Сообщений: 173
    • Просмотр профиля
Команда echo добавляет линуксовый перевод строки (\n), а виндовый, который зачастую ждут telnet-ы и minicom-ы — это 2 символа \r\n.
Так я же отсылаю и принимаю не minicom-ом а в\из com - порт(а) шлю\принимаю.
если я пишу
echo -e "show Address IP4Address InterfaceAddresses/wan_ip\n"то железка не выполняет команду и отвечает \n -недопустимый операнд.
И причем здесь
Или порт не тот,
я не въезжаю.

Если я оставляю в скрипте только одну (!) строку команду
echo -e "show Address IP4Address InterfaceAddresses/wan_ip"без /n на конце, то все отрабатывает отлично. и железка в миникоме выдает свои несколько строк,
и сама никак их не обрабатывает. Это я проверил войдя в миником в одной консоле и запуская свой скрипт в другой.

но как только я добавляю While do
то вываливается следующая история команд:
57  show Address IP4Address InterfaceAddresses/wan_ip
 58  how Address IP4Address InterfaceAddresses/wan_ip
 59  ^[EThis object is updated from Ethernet "wan".
 60  ^[E
 61  ^[E              Property  Value                       Remarks
 62  ^[E ---------------------  --------------------------  --------------------
 63  a.
 64  history

Подозреваю, что надо настроить порт через stty, видимо когда выполняется read возможно она отправляет какие то
управляющие символы которые заставляют железку выполнять как команды свой собственный вывод.
Сама read ничего не должна возвращать в тот файл из которого читает - вроде  :idiot2:


Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Разговор слепого с глухим…
Я говорю про \r, Вы пишете про \n…
Я говорю, что возможно кроме  ttyS0 могут быть какие-то порты управления, например ttyS1, Вы мне про то, что все отлично работает…
Я Вам готовый код с grep, Вы опять про while

Если послать только «s» есть ответ?
« Последнее редактирование: 18 Марта 2017, 16:59:15 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Schneider

  • Автор темы
  • Участник
  • *
  • Сообщений: 173
    • Просмотр профиля
код работает (почти).
echo -e "show Address IP4Address InterfaceAddresses/wan_ip\r" >/dev/ttyS0
grep -m 1 'Active' </dev/ttyS0 >&2 && exit 0
пришлось
echo -e "команда\r" > устройство
переделать в echo "команда\r" > устройство
потому как иначе в устройство ключ -e улетает почему то вместе с текстом т.е. железка видит -e команда, говорит ошибка и скрипт не срабатывает. И да, с ключем \r таки работает 8)

в остальном в коносле я получил заветную строку с IP адресом, а вот зайдя через минуту (!)
в minicom увидел все тоже:
 14  show Address IP4Address InterfaceAddresses/wan_ip
 15  how Address IP4Address InterfaceAddresses/wan_ip
 16  ^[EThis object is updated from Ethernet "wan".
 17  ^[E
 18  ^[E              Property  Value                       Remarks
 19  ^[E ---------------------  --------------------------  --------------------
 20  history

что касается
возможно кроме  ttyS0 могут быть какие-то порты управления, например ttyS1
железка подключена родным кабелем к компу с Ubuntu сервером. com-port используется один, кабель один (c двумя разьемами), другим концом воткнут в железку. Разве так бывает, что еще при этом может использоваться какой то второй порт ttyS1 ?
Я почему игнорировал это, потому что вообще не понял о чем идет речь. А в остальном мысль бъет ключем.
Вот и пропустил предложение с другим кодом в начале.

Короче результат пока -"недопилено" и причина не в read

Пользователь добавил сообщение 18 Марта 2017, 17:36:56:
Если послать только «s» есть ответ?
в смысле?
« Последнее редактирование: 18 Марта 2017, 17:36:56 от Schneider »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
в смысле?
echo "s" >/dev/ttyS0
Пользователь добавил сообщение 18 Марта 2017, 17:53:23:
Разве так бывает, что еще при этом может использоваться какой то второй порт ttyS1 ?
Бывает. Например при подключении USB-модема «включаются» сразу три порта.
« Последнее редактирование: 18 Марта 2017, 17:53:23 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Schneider

  • Автор темы
  • Участник
  • *
  • Сообщений: 173
    • Просмотр профиля
ну конечно "s" отсылается в устройство, потом зайдя в миником я вижу в истории выполненную команду s,
или если буду сидеть одновременно с отсылкой s в другом окне в minicom то увижу что железка ругается
что нет такой команды. да и моя команда целиком отсылается и принимается.... я же писал.

Цитата: Schneider от Сегодня в 18:28:57
Разве так бывает, что еще при этом может использоваться какой то второй порт ttyS1 ?
Бывает. Например при подключении USB-модема «включаются» сразу три порта.
А, вон вы о чем. Нет. Тут самая, что ни наесть, железная железка файрвол DFL-210 и она никаких дополнительных портов
не образует при подключении, да кроме того без драйвера подключается, а для таких USB фокусов, как я понимаю драйвера нужны еще.

Пользователь добавил сообщение 18 Марта 2017, 20:35:04:
Решено.
Все работает как надо.
Вот эта статья навела меня на мысль,
и, отключив локальное эхо, и дополнительный перевод строки
stty -echo -onlcr -F /dev/ttyS0я убрал повтор выводимой инфы (мусора) и попадание ее в качестве команд в консоль роутера.

Особое спасибо Azure за подсказки.
« Последнее редактирование: 18 Марта 2017, 23:39:16 от Schneider »

 

Страница сгенерирована за 0.089 секунд. Запросов: 25.