Данные последовательного порта .NET получены (вкл / выкл) - PullRequest
1 голос
/ 20 августа 2011

Я использую класс .NET 4 Serial Port Class и обработчик DataReceived.

В обработчике DataReceive я удаляю обработчик из последовательного порта, обрабатываю данные и повторно добавляю обработчик вконец функции.

try
{
  serial_port.datareceived -= new serialdatareceivedeventhandler(ondatareceived);

  // readline and process data
}
catch (exception ex)
{
}
finally
{
  serial_port.datareceived += new serialdatareceivedeventhandler(ondatareceived);
}

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

Ответы [ 3 ]

0 голосов
/ 20 августа 2011

Относительно этого кода:

catch (exception ex)
{
}

Никогда, никогда, никогда, никогда, никогда, никогда, никогда, никогда не пишите такой код.

Это похоже на удалениедетекторы дыма в спальнях ваших детей.

0 голосов
/ 19 ноября 2011

Если вас беспокоит возвращение, используйте lock или мьютекс:

lock(lockobj)
{
    /*Read data from the port here.*/
}

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

На самом деле , документация прямо говорит:

Одновременно может выполняться только один обработчик событий.

0 голосов
/ 20 августа 2011

Лично я бы не удалял обработчик на каждом событии DataReceived, он не нужен.Если вы не получаете уведомление о входящих данных, всегда есть возможность переполнения существующего буфера и потери информации.

Я бы использовал что-то похожее на Пример Microsoft :

Сверху статья MSDN:

 private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e)
 {
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    Console.WriteLine("Data Received:");
    Console.Write(indata);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...