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

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

2 ответа2

1

Я должен сделать код на C, чтобы обнаружить межсимвольное время в строке RS232 на Linux ...

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

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

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

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

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

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

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

1

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

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

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