Связь через последовательный порт: опрос последовательного порта против использования события DataReceived последовательного порта
-
22-07-2019 - |
Вопрос
Я просто рассматриваю код, который написал для связи с последовательным портом в C # на CF2.0. Я не использую событие DataReceived, поскольку оно ненадежно. MSDN заявляет, что:
Событие DataReceived не является гарантированно повышается для каждого байта получено. Используйте свойство BytesToRead определить, сколько данных осталось быть прочитанным в буфере.
Я опрашиваю порт с помощью read (), и у меня есть делегат, который обрабатывает данные, когда они читаются. Я также где-то читал, что «опрос плохой» (объяснение не дано).
Есть идеи, почему опрос может быть плохим? кроме обычных предупреждений о потоке - у меня есть отдельный поток (фоновый поток), который опрашивает порт, поток завершается после того, как данные прочитаны, все протестировано и работает хорошо.
Решение
Как я прочитал, вы можете получить одно событие для нескольких байтов, а не одно событие для байта. Я все еще ожидал бы получить событие, когда данные будут готовы, и не иметь его "пропустить" несколько байтов целиком.
Я всегда использовал это событие, и у меня не было проблем с ним.
Другие советы
Обычная мудрость гласит, что "опрос плохой" потому что это часто заканчивается процессом, связанным с процессором. Если вместо этого используется блокирующий ввод / вывод, то процессор доступен для других процессов, пока не произойдет событие.
Тем не менее, обычно можно настроить все так, чтобы опрос ожидал (короткого) тайм-аута перед возвратом, когда нет доступных символов. Если выбрано подходящее время ожидания, тогда ваш простой цикл опроса использует значительно меньше процессорного времени, и другие процессы также запускаются.
Я вообще не использовал последовательные порты из C #, но я рискну предположить, что под документацией подразумевается
Событие DataReceived не гарантируется для каждого полученного байта. использование свойство BytesToRead, чтобы определить, сколько данных осталось для чтения в буфере.
это то, что вы не можете ожидать получить одно событие на персонажа. При некоторых обстоятельствах он может доставить событие с более чем одним доступным символом. Просто восстановите все доступные символы в вашем обработчике событий, и все будет хорошо.
Изменить. Выполнение блокирующего вызова в потоке читателей может быть лучшим ответом в целом. Это не опрос сам по себе, так как поток блокируется, пока не поступят символы. Возможно, вам придется настроить размеры буфера и некоторые настройки последовательного порта, если вам нужно обрабатывать данные по мере их поступления, а не в виде фрагментов фиксированного размера.
Я почти уверен, что базовый код драйвера последовательного порта управляется прерываниями даже при использовании блокирующего вызова Read.