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

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

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

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

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 будет также буферизовать выходную строку.

  • Как подключить передачу файла scp / ssh (pull) через tar (удаленный -> локальный перенос, инициированный с локальной машины)
  • Мне нужно перенести очень большую папку по FTP, не создавая сначала файл
  • Перенаправление вывода запущенного процесса через SSH в фоновом режиме
  • Разноцветный Греп
  • Правильный / эффективный / надежный способ импорта записей в файл журнала в базу данных MySQL?
  • Небуферизованная команда socat для подключения последовательных портов на удаленных компьютерах и регистрации данных
  • Как производитель труб может сообщить потребителю трубки, что он достиг «Конец файла»? »(Un-named-pipe, not named-pipe)
  • Использование файлов, имеющих пробелы в их имени в трубах
  • кто может получить подсчет «базового subDir», не имея subDirs?
  • ls выводит несколько столбцов, даже если отправлен в grep с помощью zml-конфигурации grml
  • Захват данных с Fluke 1620a через netcat
  • Операторы печати в реальном времени с тройником в интерактивном скрипте
  • Linux и Unix - лучшая ОС в мире.