2014-02-18 2 views
0

Я думал о наилучшем подходе к правильной обработке связи последовательного порта в моей программе. У меня есть какое-то устройство, которое отправляет мне данные, я получаю его с использованием события DataRecieved и метода ReadExisting. Все, что он читает, помещается внутри буфера, когда последняя строка равна некоторой строке, тогда я начинаю анализировать ее на какой-то пакет.Обработка связи последовательного порта COM

Кроме того, когда я отправить данные на это устройство и ждать ответ, я пометить флаг

bool isReady = false; 

while(!isReady) 
    Thread.Sleep(500); 

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

Мне было интересно, как вы, ребята, разрешите это дело в своем коде?

Спасибо, и извините за плохой английский.

+0

Похоже, вы используете событие DataReceived. Не используйте его, вы не используете его. Просто позвоните в Read(). –

ответ

0

Не просто ждать ответа в бесконечном цикле. Используйте события, как вы упомянули ранее, чтобы получить данные. См. Также этот другой вопрос. SerialPort class and DataReceived event... Getting bytes. Use ReadLine or ReadExisting? Any examples?

+0

Ожидание события было бы здорово обработать проблемы, вызываемые самим устройством. Но как это сделать, когда я отправляю один запрос на устройство, тогда мне нужно ждать ответа, и в зависимости от этого ответа отправьте другой запрос и т. Д.? Я не могу просто выйти из метода и ждать события. – Marduk

+0

С помощью событий вы можете поддерживать отзывчивое приложение, сохраняя связь с последовательным портом. Просто сохраните состояние (какое последнее действие/запрос было в этом экземпляре) в родительском или классе, инкапсулирующем логику. Подумайте о событии, а не о единственном методе. Таким образом, у вас есть возможность отменить и т. Д., Поскольку вы могли бы построить эту логику в – eazynow

+0

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

-1

Пока я добавил таймаут 5SEc используя следующий код:

bool isReady = false; 
DateTime timeout = DateTime.Now; 
while(!isReady) 
{ 
    Thread.Sleep(500); 
    if((DateTime.Now-timeout).TotalMiliseconds >= 5000) 
     break; 
} 

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