2009-03-13 5 views
15

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

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

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

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

ответ

17

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

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

+1

Абсолютно, это мой опыт также. – Andy

7

Условная мудрость гласит, что «опрос является плохим», потому что он часто заканчивается процессом, связанным с процессором. Если вместо этого используется блокировка ввода-вывода, тогда ЦП доступен для других процессов до тех пор, пока не произойдет событие.

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

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

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

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

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

+0

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

1

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

Смежные вопросы