Извлечение символов из последовательного порта

У меня есть фиктивный вопрос для вас, я пытаюсь извлечь некоторые строки из файла, начиная с специальной строки символов и скопировать их в файл. Я пытался :

cat /dev/ttyACM0 | grep "something" > essai 

Файл создан, но он ничего не содержит!

  • Есть ли другой способ использовать tail -f для работы grep -q &&?
  • UDEV-правило: открыть новое окно gnome-terminal на usb-plugin И активировать его для stdin / stdout / stderr?
  • Удаление пустых каталогов командой 'ls'
  • Чтение с произвольного fd текущего процесса
  • Получить абсолютный путь к файлу OS X
  • Труба не поднимает stdout
  • Многосторонняя двусторонняя связь отдельных программ
  • Способы оптимизации производительности в трубопроводах по сети (RSH и SSH)
  • One Solution collect form web for “Извлечение символов из последовательного порта”

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

    Но, когда ввод программы происходит от терминала (например, вашего последовательного порта), операционная система делает услугу пользу и возвращает строку за раз (программа может изменить это, поставив терминал в необработанный или неканонический режим ; нет).

    И когда программа использует библиотеку stdio , стандартный вывод на терминал (документация вызывает это «интерактивное устройство») по умолчанию представляет собой буферизацию строки, но вывод в файл или канал полностью буферизируется.

    Программа, использующая библиотеку stdio, может выбирать полную буферизацию, буферизацию строк или отсутствие буферизации, вызывая setvbuf . Он также может вызывать fflush чтобы заставить писать, когда захочет.

    GNU grep принимает --line-buffered , которая будет запускать следующий код в функции, которая выводит соответствующую строку:

     if (line_buffered) fflush (stdout); 

    Соединяя все части:

    С помощью этой команды:

     cat /dev/ttyACM0 | grep "something" > essai 

    cat будет читать строку за раз от /dev/ttyACM0 . После того, как он собрал несколько килобайт вывода, он будет записывать в трубу. Он повторит это до тех пор, пока чтение не вернет счет нуля или не сработает (что, вероятно, не произойдет, пока последовательный порт не отключится).

    grep будет читать несколько килобайт за раз из трубы, и после того, как он накопил несколько килобайт продукции, он напишет в essai фл. Он будет повторять это до тех пор, пока чтение не вернет счет нуля или не сработает, что произойдет, если и когда процесс cat завершится.

    Таким образом, вы не увидите ничего в файле essai до тех пор, пока grep не найдет подходящие строки в несколько килобайт.

    Чтобы получить выход, записанный в файл более оперативно, вы можете указать GNU grep этот параметр:

     grep --line-buffered < /dev/ttyACM0 > essai 

    Поскольку он считывается из последовательного порта, он будет буферизироваться по строке, а --line-buffered будет также буферизовать выходную строку.

    Linux и Unix - лучшая ОС в мире.