1

Я пытаюсь записать данные с последовательного устройства на маршрутизатор 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? или каков мой лучший подход, чтобы либо сохранить все данные, либо предсказуемо отбросить их без этой случайной проблемы потерянных / объединенных строк?

1 ответ1

0

Суть вопроса, что процессор был узким местом, была неправильной.

Проблема появлялась и исчезала постоянно, когда я добавил и удалил USB-концентратор из настройки. Это было под маркой Dodoro, но также случилось с другим хабом, который у меня был под рукой, Qicent с маркой, оба имели порты 3xUSB3 плюс гигабитный Ethernet или от lsusb:

Bus 001 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 001 Device 002: ID 2109:2813 VIA Labs, Inc.

Таким образом, это может быть похоже на другие вопросы о концентраторах, например, концентраторы действуют как узкое место, где решение о том, чтобы получить концентраторы с несколькими TT, кажется, решением. Однако в моем случае проблема возникает только с двумя устройствами, концентратором и адаптером FTDI USB-to-RS232, поэтому кажется странным, что для связи только с одним устройством потребуется концентратор с несколькими TT Если только разговор с вышестоящим (маршрутизатором) контроллером USB не считается другим устройством.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .