Связь через последовательный порт: опрос последовательного порта против использования события DataReceived последовательного порта

StackOverflow https://stackoverflow.com/questions/644623

  •  22-07-2019
  •  | 
  •  

Вопрос

Я просто рассматриваю код, который написал для связи с последовательным портом в C # на CF2.0. Я не использую событие DataReceived, поскольку оно ненадежно. MSDN заявляет, что:

  

Событие DataReceived не является   гарантированно повышается для каждого байта   получено. Используйте свойство BytesToRead   определить, сколько данных осталось   быть прочитанным в буфере.

Я опрашиваю порт с помощью read (), и у меня есть делегат, который обрабатывает данные, когда они читаются. Я также где-то читал, что «опрос плохой» (объяснение не дано).

Есть идеи, почему опрос может быть плохим? кроме обычных предупреждений о потоке - у меня есть отдельный поток (фоновый поток), который опрашивает порт, поток завершается после того, как данные прочитаны, все протестировано и работает хорошо.

Это было полезно?

Решение

Как я прочитал, вы можете получить одно событие для нескольких байтов, а не одно событие для байта. Я все еще ожидал бы получить событие, когда данные будут готовы, и не иметь его "пропустить" несколько байтов целиком.

Я всегда использовал это событие, и у меня не было проблем с ним.

Другие советы

Обычная мудрость гласит, что "опрос плохой" потому что это часто заканчивается процессом, связанным с процессором. Если вместо этого используется блокирующий ввод / вывод, то процессор доступен для других процессов, пока не произойдет событие.

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

Я вообще не использовал последовательные порты из C #, но я рискну предположить, что под документацией подразумевается

  

Событие DataReceived не гарантируется для каждого полученного байта. использование   свойство BytesToRead, чтобы определить, сколько данных осталось для чтения в буфере.

это то, что вы не можете ожидать получить одно событие на персонажа. При некоторых обстоятельствах он может доставить событие с более чем одним доступным символом. Просто восстановите все доступные символы в вашем обработчике событий, и все будет хорошо.

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

Я почти уверен, что базовый код драйвера последовательного порта управляется прерываниями даже при использовании блокирующего вызова Read.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top