Чтение с последовательного порта с событием DataReceived - PullRequest
2 голосов
/ 25 июня 2011

У меня есть приложение Visual Studio 2008 C # .net 2.0 CF, которое читает данные через последовательный порт, используя класс System.IO.Ports.SerialPort. К сожалению, SerialDataReceivedEventHandler никогда не вызывается.

Я открываю порт так:

private SerialPort serial_port_;
protected void OpenSerialPort(string port, int baud)
{
    if (serial_port_ == null)
    {
        serial_port_ = new SerialPort(port,
                                  baud,
                                  Parity.None,
                                  8,
                                  StopBits.One);
    }
    else
    {
        serial_port_.BaudRate = baud;
        serial_port_.PortName = port;
    }

    if (!serial_port_.IsOpen)
    {
        serial_port_.Open();
        serial_port_.DataReceived += new SerialDataReceivedEventHandler(OnSerialDataReceived);
    }
}

private void OnSerialDataReceived(object sender, SerialDataReceivedEventArgs args)
{
    Debug.WriteLine("Serial data received");
}

Если, однако, я добавлю Debug.WriteLine(serial_port_.ReadLine()); сразу после открытия порта, я вижу в окне вывода строку текста с порта, как я и ожидал.

Итак, почему ReadLine работает, а событие DataReceived - нет?

Спасибо, PaulH


Редактировать: Дальнейшее тестирование показывает, что этот код работает на некоторых устройствах, но не на других. Что для правильной работы события DataReceived?

Дальнейшее разочарование: На этом устройстве ReadExisting всегда возвращает ноль, а BytesToRead всегда возвращает 0. ReadLine() и Read() отлично работают, хотя.

1 Ответ

2 голосов
/ 25 июня 2011

Не помещайте блокирующие чтения в обработчик полученных данных.Если обработчик сработает и НЕ будет прочитана целая строка , он заблокируется.В опубликованном вами коде нет никаких операций чтения.

Из MSDN: «События PinChanged, DataReceived и ErrorReceived могут вызываться не по порядку, и между задержкой основного потока может быть небольшая задержкасообщает об ошибке и при выполнении обработчика события. Одновременно может выполняться только один обработчик события."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...