Я должен сделать код на 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), то получатель слишком долго молчал, указывая на разрыв между сообщениями.