linux высокоскоростное обнаружение символов rs232

linux высокоскоростное обнаружение символов rs232

Мне нужно написать код на C для определения времени между символами в строке rs232 на Linux. Время между символами для определения может составлять 1 мс. Поэтому мне нужно что-то, что будет очень быстро ставить метку времени на входящие символы. Когда я говорю «очень быстро», это значит менее 1 мс. Цель — определить конец кадра и начало нового кадра в строке.

Я не прошу решения по кодированию, я просто хочу получить начальную помощь, чтобы знать, какой путь мне выбрать: возможно ли сделать это на Linux? Мне нужно изменить драйвер, чтобы достичь такого времени? Или что-то в пространстве пользователя может это сделать (я так не думаю).

решение1

Это встроенный UART или USB-донгл? Для начала я бы изменил процедуру прерывания последовательного драйвера, чтобы сохранять данные вместе с временной меткой, доставлять данные с временной меткой в ​​пространство пользователя и позволять пространству пользователя разобраться с этим. Хотя Linux не работает в реальном времени, я бы ожидал, что он сможет отвечать на все прерывания менее чем за 1 мс, так что этого должно быть достаточно.

Для USB-ключа usbmonуже предусмотрены временные метки в микросекундах, поэтому я полагаю, что его можно использовать usbmonвместе с обычным драйвером последовательного USB или изменить драйвер последовательного USB, чтобы сделать эти временные метки доступными.

решение2

Мне нужно написать код на языке C для определения времени между символами в строке rs232 на Linux...

Вы опубликовалипроблема XY.

Я хочу это сделать, потому что тишина более 1 мс означает конец кадра и начало нового кадра.

(Кстати, в асинхронных последовательных коммуникациях, таких как RS-232, неквалифицированное использование"рамка"неоднозначно, поскольку каждый символ обрамлен. Например, когда UART сообщает об «ошибке кадрирования», символ (возможно) был потерян. Вероятно, вы на самом деле имеете в виду пакет или единицу сообщения.)

Ваш дополнительный комментарий наконец-то раскрывает реальную проблему X, которую необходимо решить.
Поскольку реальная проблема заключается в обнаружении пробелов между сообщениями, ваш изначальный вопрос о Y не только трудно реализовать в программном обеспечении, но и не является жизнеспособным решением проблемы X.

Любое решение, включающее «измерение» временного интервала между полученными символами программным обеспечением для обнаружения промежутка между сообщениями, является некорректным решением. Этот подход не работает в вырожденном случае:
когда приходит последний символ сообщения и если больше нет символов (в течение некоторого времени), то это последнее полученное сообщениезаглохнеопределенно долго, пока алгоритм ждет следующий символ (первый байт следующего сообщения), чтобы можно было вычислить разницу во времени.
Пока этот «следующий символ» не получен, «конец сообщения» не определяется, и последнее допустимое сообщение завершается, но не обрабатывается.

Правильное решение — использовать оборудование, которое может измерить, когда символ был или, скорее, не был получен. Некоторые Atmel USART имеютТайм-аут приемникафункция обнаружения разрыва между сообщениями.

Возможное программное решение потребовало бы периодического таймера (высокого разрешения), который драйвер U(S)ART использовал бы для подсчета временных интервалов между полученными символами. Используя PIO вместо DMA, драйверу пришлось бы сбрасывать счетчик интервалов при получении каждого символа. Когда счетчик превышает пороговое значение (то есть count * interval_time > inter_message_gap_time), это означает, что приемник слишком долго молчал, что указывает на промежуток между сообщениями.

Связанный контент