Как управлять транзакциями с SerialPort? - PullRequest
0 голосов
/ 20 марта 2012

В настоящее время я работаю над приложением, которое связывается с электронным устройством через SerialPort.

  • Эта связь осуществляется в полудуплексном режиме, когда приложение является ведущим, а устройство - подчиненным.Ведущий должен отправить сообщение на устройство, и устройство должно ответить до отправки следующего сообщения.
  • Если сообщение не получает ответ, приложение должно отправить его повторно.
  • Содержимое следующего сообщения зависит от результата текущего сообщения.то есть каждое новое сообщение имеет увеличенный порядковый номер, и иногда данные для следующего сообщения берутся из ответа текущего.
  • Для отправки сообщений я использую интерфейс System.IO.Ports.SerialPort.При получении сообщений запускается SerialDataReceivedEventHandler.

Какой лучший способ для меня это сделать?Есть ли образец, на котором я могу основать это?

Ответы [ 2 ]

0 голосов
/ 20 марта 2012

Подход Шейна Веалти правильный, но я думаю, что вы действительно можете спросить себя, должны ли вы использовать темы? Даже если это сценарий «ведущий / ведомый», следует ли вам слушать поток? Когда вы слушаете порт и когда отправляете?

Самый простой подход - без ниток

Вам не нужно использовать потоки в этом сценарии из-за конфигурации master / slave, все, что у вас есть, это две функции.

SendCommand(char * bfr)
{
}

RecieveCommand(char * bfr)
{
}

SendCommand( txBfr );
RecieveData( rxBfr );
// process receive buffer, prepare new command
SendCommand( txbfr );
RecieveCommand( rxBfr );
// and so on

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

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

0 голосов
/ 20 марта 2012

Я работал над чем-то похожим в прошлом.Это базовая структура сообщений, которые я использовал:

Приложение: команда отправки Seq # 1 -> <- Устройство: команда подтверждения, seq # 1 (включая любой специфический для команды ответ) </p>

Если устройство не подтвердит в течение 1 секунды, будет отправлена ​​та же команда, тот же порядковый номер.Эта последовательность «повторных попыток» произойдет 3 раза, а затем произойдет тайм-аут и завершит работу команды.

Порядковый номер со стороны приложения будет увеличиваться на единицу для каждой отправленной им команды, которая не была повторной.После нажатия 99 он вернется к порядковому номеру 1.

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

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

...