Я пытаюсь записать данные с последовательного устройства на маршрутизатор OpenWrt.
Все данные основаны на ASCII, 115200 бод, 8N1, но подключены только передача, прием и земля (без управления потоком). Устройство отправляет 50 строк текста в секунду, по 76 символов в строке (плюс CR+LF это будет 50x78 = 3900 символов / с, и с учетом этого 1 стартовый бит (?), 8 бит данных и 1 стоповый бит на символ Казалось бы, нужно 10 бит на символ, так что 39000 бит / с из имеющихся 115200 - это не должно быть максимально, верно?)
Проблема в том, что данные отбрасываются, строки обрезаются, объединяются и т.д. В том, что я сохраняю в NVRAM. И если я пропущу это через head
или cut
чтобы остановить его, скажем, ровно 30000 строк, что должно занять ровно 10 минут, потребуется 11 или 12 минут, чтобы добраться до этого количества строк из-за потерянных / усеченных / объединенных строк. Например, следующее должно показывать одинаковое количество полей в каждой строке, но показывает 3 примера поврежденных строк:
$label,014704260,000000000,000000000,000000000,000000000,000000000,453266711
$label,014704280,000000000,000000000,000000000,000000000,000000000,498035313
$label,014704300,000000000,000000000,000000000,000000000,000000000,564242105
$label,014704320,190418.30,000000000,000000000,000000000,000000000,458805062
$label,014704340,000000000,000000000,000000000,000000000,000000000,447439419
$label,014704360,000000000,000000000,000000000,000000000,000000000,515812674
$label,014704380,000000$label,014704500,000000000,000000000,000000000,000000000,000000000,430368215
$label,014704520,190418.50,000000000,000000000,000000000,000000000,474793672
$label,014704540,000000000,000000000,000000000,000000000,000000000,514101937
$label,014704560,000000000,000000000,000000000,000000000,000000000,498089337
$label,014704580,000000000,000000000,000000000,000000000,000000000,479420800
$label,014704600,000000000,000000000,000000000,000000000,000000000,568108911
$label,014704620,000000000,000000000,00000000000,497468975
$label,014704640,190418.60,000000000,000000000,000000000,000000000,509747997
$label,014704660,000000000,000000000,000000000,000000000,000000000,441899024
$label,014704680,000000000,000000000,000000000,000000000,000000000,543482880
$label,014704700,000000000,000000000,000000000,000000000,000000000,445069837
$label,014704720,190418.70,000000000,000000000,000000000,000000000,517975535
$label,014704740,000000000,000000000,000000000,000000000,000000000,477103089
$label,014704760,000000000,000000,000000000,483954418
$label,014704860,000000000,000000000,000000000,000000000,000000000,484600994
$label,014704880,000000000,000000000,000000000,000000000,000000000,489675319
Также поле 2 представляет собой счетчик миллисекунд, увеличивающийся на 20 на строку, а поле 3, если оно присутствует (каждая 5-я строка), равно hhmmss.ss. Это показывает, что в то же время, когда линии усекаются / объединяются, также теряются 3-5 строк (0,1 с).
Очевидно, что что-то узкое место, отставание, нарушение синхронизации, переполнение буфера и т.д.
Я даже могу быть удовлетворен тем, что отбрасываю 80% или 98% данных (сохраняя только 1 строку каждые 5, или 1 строку каждые 50, если они согласованы), но я не могу найти достаточно низкоуровневый способ их отбрасывания не страдая от той же проблемы. Я пробовал такие вещи, как awk 'NR % 5 == 0' /dev/ttyUSB0
, с передачей или без передачи этого на fifo, а затем только вход в систему оттуда на NVRAM и т.д. Также пробовал различные комбинации nice -n -19
и ionice -c 1 -n 0
который должен быть классом "реального времени" в моей первой (awk) команде, которая читает из ttyUSB0, затем я использую более низкий приоритет для отфильтрованного (меньшего) потока данных.
Есть ли более низкий уровень или менее ресурсоемкий способ записи этих данных или удаления строк, скажем, в обработчике stty или где-то еще? Установить больший буфер на tty? или каков мой лучший подход, чтобы либо сохранить все данные, либо предсказуемо отбросить их без этой случайной проблемы потерянных / объединенных строк?