Периодическая задержка последовательного порта
Я читаю данные с датчика, подключенного к стандартному последовательному порту RS-232 в обычном ядре Linux (Ubuntu 12.04)
Датчик выдает на частоте 1000 Гц. И подключается со скоростью 115200 бод, 8N1. Каждое показание датчика составляет 4 байта для общей пропускной способности 4 Кбит / с. Паттерн передачи, подтвержденный осциллографом, представляет собой 4-байтовый пакет с последующей паузой около миллисекунды. Датчик очень и очень последовательный.
99% пакетов принимаются с очень низкой задержкой. Однако для примерно 0,5% байтов последовательный порт считывает блоки в течение 2-8 мс. После этого блока все "пропущенные" байты читаются очень быстро. Это говорит о том, что в редких случаях данные буферизуются.
Я экспериментировал с приоритетом планировщика (приятно) и настройками последовательного порта (ASYNC_LOW_LATENCY, VMIN, VTIME, необработанные, неблокирующие настройки и т. Д.). Ни один из них, кажется, не имеет какого-либо заметного эффекта.
Есть ли что-нибудь еще, что я могу сделать, чтобы получить более последовательное чтение последовательного порта, кроме перекомпиляции ядра или перехода на более оперативную ОС?
2 ответа
Ответ может быть предоставлен с программными или аппаратными аргументами. См., Например, Высокая задержка в соединении RS232 на PXA270 или https://electronics.stackexchange.com/questions/96893/what-can-i-do-to-decrease-the-latency-from-these-serial-ports-which-are-attached.You можете попытаться использовать параметр low_latency paramlow_latency, как это предлагается в разделе Минимизировать задержку последовательного порта Linux.
У меня также возникла эта проблема при чтении последовательного порта на моем Jetson AGX Orin. На самом деле я попробовал патч PREEMPT rt и установил для потока чтения приоритет реального времени. Большую часть времени латентностьread()
составляет около 200 мкс, но иногда скачет до 2-4 мс.
я тоже попробовалASYNC_LOW_LATENCY
флаг, но это не меняет результатов.