Событие DataReceived иногда не срабатывает - PullRequest
1 голос
/ 18 октября 2011

Я общаюсь с устройством через SerialPort. Устройство имеет RS-485, с другой стороны (ПК) - RS-232 (виртуальный порт). Устройство работает, отправляет и получает данные правильно.

Проблема в том, что событие DataReceived иногда не запускается. Я отправляю данные на устройство, используя System.Timer, каждые 10 секунд. В большинстве случаев он работает нормально, но каждые 1-10 минут я не получаю ответ, а затем, еще 2-4 раза, событие DataReceived, наконец, запускается, и я получаю кластер данных (все, что я ранее «просил») в буфере).

Мой вопрос: Как это возможно ?

Я не могу поместить пример кода здесь, извините, но в моем приложении нет многопоточности (только основной поток и потоки с событиями Timer_Elapsed и DataReceived, я думаю, что они возникают в отдельных потоках), мой Событие DataReceived обрабатывается быстро и не должно вызываться параллельно (достаточно 10 секунд, время отклика устройства меньше 1 секунды). Если я использую Thread.Sleep, он будет в тех местах, где я уверен, что он не будет мешать чему-либо.

Это может быть скорее аппаратная, чем программная проблема, поскольку COM-порт работает некорректно, когда я тестирую его с помощью других приложений (одно из которых, которое производитель устройства предоставил для проверки соединения, не ' Выглядит так, как будто это было написано на C #). Но я не так хорош с оборудованием. Может быть, что-то не так с ПК или COM-портом (он не встроенный, а внешний)? Или это может быть связано с операционной системой (мое приложение - служба Windows, работающая под Windows Server 2003).

Ответы [ 2 ]

3 голосов
/ 18 октября 2011

Мне кажется, что буфер не очищается, когда вы ожидаете.

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

См. http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx

(Кстати, событие DataReceived действительно возникает во вторичном потоке.)

Вы пытались настроить свойства ReadBufferSize и ReceivedBytesThreshold ? Вот где я бы начал расследование. Знаете ли вы приблизительный размер сообщений? Возможно, вы захотите установить для свойства ReceivedBytesThreshold чуть меньше минимального размера сообщения, которое вы ожидаете получить от устройства. Затем вам может понадобиться короткий период ожидания, чтобы получить последние несколько байтов для завершения сообщения.

1 голос
/ 19 октября 2011

Оказалось, что это аппаратная проблема.

Соединение между устройствами выглядит следующим образом: Устройство <> RS-485 <> Конвертер1 <> LAN <> Конвертер2 <> RS-232 <> Компьютер <> Виртуальный COM

Конвертер1, кажется, работает неправильно, он группирует и хранит данные, которые мое устройство отправляет ему. Теперь я знаю, что не так, я могу позволить компетентным людям позаботиться об этом:)

Спасибо @ Matthew Rodatus за вашу помощь. Ваш ответ окольным путем заставил меня проверить, что именно и когда именно приходит на мой COM.

...