Технический форум по робототехнике.
=DeaD= » 22 янв 2014, 19:12
Прошу помощи linux-спецов по sh или awk
Решаю задачу на OpenWRT (OR-WRT)
Лучше конечно на sh, т.к. сейчас скрипт на нём.
Нужно скинуть "на экран" или в файл или в переменную окружения содержимое входящего буфера /dev/ttyUSB0.
Просто копирование подвешивается навсегда, что и логично
![Smile :)](http://roboforum.ru/images/smilies/smile.gif)
Как скопировать до момента, пока там есть данные?
hudbrog » 22 янв 2014, 19:27
stty чтобы установить параметры порта, cat чтобы читать с него
=DeaD= » 22 янв 2014, 19:35
cat прервется, когда буфер будет пустой в последовательном порту?
hudbrog » 22 янв 2014, 19:40
боюсь соврать, стоит проверить на настоящем железе..
есть подозрение что cat может висеть бесконечно (или пока не прийдет SIGHUP).. вполне можно сделать poor man's timeout что-нить типа:
cat /dev/ttyUSB0 > /tmp/somefile &
pid=$!
sleep 5
kill -9 $pid
Ну или можно попробовать какой-нить read с параметром -t... там много вариантом, стоит экспериментировать.. head тоже интересный вариант, если надо прочитать строку
=DeaD= » 22 янв 2014, 19:45
Вот какое-то такое увидел в группах гугл, может это чем-то помочь?
- Код: Выделить всё • Развернуть
#!/bin/bash
# Port setting
stty -F /dev/ttyS1 raw speed 9600
# Loop
while [ 1 ]; do
READ=`dd if=/dev/ttyS1 count=1`
echo $READ
done
elmot » 22 янв 2014, 20:17
=DeaD= писал(а):Вот какое-то такое увидел в группах гугл, может это чем-то помочь?
- Код: Выделить всё • Развернуть
#!/bin/bash
# Port setting
stty -F /dev/ttyS1 raw speed 9600
# Loop
while [ 1 ]; do
READ=`dd if=/dev/ttyS1 count=1`
echo $READ
done
Не думаю.
Вообще ты неправильно к делу подходишь. Читать уарт надо либо до какого-либо символа завершения либо до таймаута. Иначе это все костыли и рейс-кондишены.
=DeaD= » 22 янв 2014, 20:27
Да мне бы в STDOUT выплюнуть всё что там есть в буфере и больше пока ничего не надо
![Smile :)](http://roboforum.ru/images/smilies/smile.gif)
setar » 22 янв 2014, 20:39
там нет буфера, это поток (в терминах линукса это character device)
разные программы могут по разному этот поток разбивать для анализа (буфферизация внутри обработчика потока),
например по символу перевода строки
Следовательно признак окончания передачи нужно придумать (или сделать процесс цикличным)
elmot » 22 янв 2014, 20:48
именно. Dead, придумай другой алгоритм.
=DeaD= » 22 янв 2014, 21:38
С буфером ясно, спасибо! Это была моя главная ошибка! Сейчас почти получил то, что нужно. Ответ уже получаю.
Только не пойму, почему у меня после ответа контролер сыплет ERR - вроде ничего лишнего ему не высылаю.
Добавлено спустя 10 минут 36 секунд:Сейчас делаю так:
- Код: Выделить всё • Развернуть
#!/bin/sh
echo "Content-type: text/html"
echo
echo "OK"
echo -n "["
cat /dev/ttyUSB0 &
pid=$!
echo "$QUERY_STRING" > "/dev/ttyUSB0"
sleep 1
kill -9 $pid
echo -n "]"
Выдаёт вот что:
- Код: Выделить всё • Развернуть
OK
[Drv(100,0)
ERR09 in Drv cmd
ERR09 in Drv cmd
ERR09 in Drv cmd
]
Только "ERR09 in Drv cmd" не 3 раза выводит, а 200 раз
![Smile :)](http://roboforum.ru/images/smilies/smile.gif)
elmot » 22 янв 2014, 21:43
цепляй другой USB-UART и смотри что туда летит
=DeaD= » 22 янв 2014, 22:54
Такое ощущение, что роутер после закрытия порта гадит в /dev/ttyUSB0
Добавлено спустя 1 час 11 минут 3 секунды:Подцепил второй USB-UART - ничего подобного.
Много думаю, что за ерунда.
Телнетом отправляю команты контроллеру - всё отлично.
Слушаю что пишет роутер - всё отлично.
Связываю их друг с другом - сплошные ошибки
![Smile :)](http://roboforum.ru/images/smilies/smile.gif)
hudbrog » 22 янв 2014, 23:00
Я бы все же выставил настройки порта с помощью stty... Не из эфира вселенной же он скорость и контроль четности берет...
=DeaD= » 22 янв 2014, 23:49
Как и ожидалось - настройки порта не помогли.
Добавлено спустя 22 минуты 44 секунды:
Буду менять подход к задаче, как-то коряво, действительно.
linvinus » 23 янв 2014, 10:41
=DeaD=,
мы с dccharacter'ом вот тут
forum87/topic10646-960.html#p289779аналогичную задачу решали
Я лично таким образом дамплю логи с контроллера в файл чтобы потом обработать в gnuplot
В общем случае сначала нужно корректно настроить порт командой stty,
потом синхронизировать буфер, например посылать команду ping и ждать правильного ответа,
потом передавать команды
Ещё можно использовать команду expect
Для отладки можно использовать команду script (
http://manpages.ubuntu.com/manpages/har ... ipt.1.html)
пожалуй это тут мало пригодно.