linux высокоскоростное распознавание символов rs232

346
romaric crailox

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

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

0
Похоже, вы хотите мягкое поведение в реальном времени. Это будет трудно даже достичь, используя компьютерное и программное обеспечение Daniel B 6 лет назад 1
Даже если я изменю драйвер, который уже используется (я буду ближе к оборудованию ...)? romaric crailox 6 лет назад 0
Я думаю, вам лучше попытаться уловить необработанные сигналы. Для низких скоростей передачи данных вы можете использовать аудиовход, но для более высоких скоростей вам потребуется высокоскоростной интерфейс захвата AD. По сути вам нужен программный осциллограф. AFH 6 лет назад 1
Спасибо AFH, но я думаю, что есть ошибка. Я не хочу делать эту программу на C для отладки, но чтобы можно было обнаружить молчание в 1 мс для примера между приемом двух символов в строке rs232. Я хочу сделать это, потому что молчание более 1 мс означает конец кадра и начало нового кадра. romaric crailox 6 лет назад 0

2 ответа на вопрос

1
dirkt

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

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

Это бортовой UART. Это тоже мое «любимое» решение, потому что в моей ситуации написать собственный драйвер проще, чем, к сожалению, сменить аппаратное обеспечение. romaric crailox 6 лет назад 0
1
sawdust

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

* Любое решение, включающее «измерение» временного интервала между полученными символами программным обеспечением для обнаружения пропуска между сообщениями, является ошибочным решением. * К сожалению, MODBUS по последовательной линии связи является такой вещью и, вероятно, не единственным протоколом, который делает это. pim 6 лет назад 1
@pim - Я знаю о протоколе MODBUS, так в чем твоя точка зрения? Похоже, вы либо не читали ответ, либо не понимаете связанных с этим проблем. Надлежащим решением для таких протоколов является обнаружение тайм-аута при получении, тогда как метки времени, а затем вычисление дельта-времени (т. Е. Измерение временного интервала) имеют недостатки (т.е. не работают во всех без исключения ситуациях). sawdust 6 лет назад 1
Я не уверен, что понимаю ваш вырожденный случай: если у меня есть очень быстрое решение, которое отметит время любого входящего персонажа, сделанного слоем низкого уровня. После этого программа пользовательского пространства, когда-нибудь, прочитает все доступные символы и с помощью метки времени определит пакет символов. Этот подход позволяет обойти вырожденный случай: когда программа пользовательского пространства считывает последний доступный символ, она вычисляет, с отметкой времени и временем работы системы, начиная с того, сколько доступно символа времени. И может определить, является ли это символьным пакетом или нет. Я не прав ? romaric crailox 6 лет назад 0
* "когда программа пространства пользователя читает последний доступный символ" * - Это ненадежно. Этот * «последний символ» * (в зависимости от конфигурации * termios *) может быть просто фрагментом сообщения, а не его концом. * «Это вычисление с отметкой времени и временем работы системы» * - Это вычисление просто дает задержку между уровнем прерывания и вашим приложением; что хорошего в этом? Кроме того, эта задержка может быть значительной (например, несколько миллисекунд), особенно когда пользовательское пространство приостановлено. Поэтому ваш расчет может привести к ложным срабатываниям за 1 мс молчания не того персонажа. sawdust 6 лет назад 1
@pim - Вот трехлетний ответ, чтобы подтвердить мое опровержение на ваш комментарий: https://stackoverflow.com/questions/27152926/parsing-time-delimited-uart-data/27156684#27156684 sawdust 6 лет назад 1

Похожие вопросы