Как установить тайм-аут межбайтовой задержки в миллисекундах?

В настоящее время я работаю с termios для последовательной связи в Linux.

Мне нужно установить межсимвольный тайм-аут на 5 мс.

Я нашел способ установить тайм-аут между символами, используя VMIN и VTIME, где VMIN должен быть VMIN> 0 и VTIME> 0.

Проблема в том, что мне нужно установить VTIME на 5 мс, но VTIME выражается в десятых долях секунды.

Тип данных VTIME — беззнаковый символ, поэтому я не могу просто установить его на 0,05.

Кто-нибудь знает, есть ли способ обойти это?


person Community    schedule 17.11.2019    source источник


Ответы (1)


Мне нужно установить тайм-аут между символами на 5 мс.
...
Кто-нибудь знает, есть ли способ обойти это?

Нет, установить время ожидания termios меньше 100 мс невозможно.
В зависимости от вашего оборудования и конфигурации ядра этот тайм-аут может быть вообще ненадежным, особенно если вы пытаетесь обнаружить сообщения, разделенные временем.< br /> Обработка termios как минимум на целый уровень выше драйвера устройства UART (см. Последовательные драйверы Linux).
Если ваше ядро ​​не настроено на обеспечение того, чтобы нижняя половина драйвера UART и потоки kworker для termios имели высокий приоритет и низкую задержку, то короткие межсимвольные интервалы не могут быть точно или надежно определены.

Если UART использует FIFO для буферизации входящих данных, то это оборудование скрывает межсимвольный интервал, который может обнаружить программное обеспечение.
Аналогичным образом, когда драйвер UART использует DMA для хранения полученных данных, межсимвольная синхронизация будет скрыта.
При использовании DMA ЦП не участвует в обработке полученных данных до тех пор, пока операция DMA не будет завершена, и вся временная информация о любом межсимвольном разделении не будет удалена.
(Критически важная информация, такая как ошибка кадрирования и/или ошибка четности, затруднена / невозможно определить конкретный байт при использовании DMA.)
Даже без DMA termios сможет использовать синхронизацию только на основе передачи данных через tty flip буферы (это слой, удаленный из синхронизации на провод).

Некоторые UART имеют оборудование, помогающее обнаруживать конец сообщения по свободной линии.
Например, SoC Atmel/Microchip ATSAMA5 и AT91SAM9 имеют USART с функцией тайм-аута приемника, которая измеряет время простоя после каждого полученного кадра.< br /> Когда это время простоя линии превышает указанное значение, может быть сгенерировано прерывание.
Драйвер Linux для Atmel USART обычно использует прерывание по тайм-ауту приемника, чтобы (преждевременно) завершить текущую операцию приема DMA и скопировать содержимое буфера DMA в буфер переключения tty.

Таким образом, вы не можете или не должны полагаться исключительно на настройки VMIN и VTIME для обнаружения сообщений, разделенных временем. См. Анализ данных UART с временными разделителями.
Пакеты сообщений должны иметь символы-разделители/сторожевые символы/байты, чтобы сообщения можно было надежно анализировать и проверять.
См. разбор полных сообщений из последовательного порта для примера эффективного использования системных вызовов с локальным буфером.

person sawdust    schedule 18.11.2019