C # COM Дизайн системы обмена сообщениями - PullRequest
0 голосов
/ 27 мая 2010

Я могу использовать некоторую помощь для разработки моих классов соединений COMport.

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

Поэтому, когда бы я ни отправлял что-то через компорт, он должен ждать подтверждения, прежде чем продолжить. Конечно, я не хочу что-то вроде while(!ack) wait().

Если подтверждение не получено в течение 1 секунды или около того, он должен отправить команду еще раз. Ack выглядит по-разному для каждого типа команды (примечание: только тип, без идентификатора сообщения). Подключенное устройство также отправляет сообщения (кроме ACK), которые должны обрабатываться самим приложением.

Есть ли у кого-нибудь предложения о простом и гибком способе (возможно, шаблон проектирования? Образец?), Чтобы это исправить?

1 Ответ

1 голос
/ 27 мая 2010

Вы, вероятно, захотите выделенный поток, который обрабатывает сообщения.Вам понадобится Очередь, в которую клиентский код может отправить сообщение, защитите его с помощью ReaderWriterLockSlim.Нет необходимости в событии DataReceived, просто вызовите SerialPort.Read () напрямую.Определите таймауты с помощью свойства ReadTimeout.Если вы получаете ответы, которые должны вернуться к клиентскому коду, используйте событие.

Остерегайтесь разработки протокола, сделать это не так просто.Вы защитите свою систему от потери байтов, но вероятность потери ACK также высока.Микроконтроллер увидит одну и ту же команду дважды.Теперь вам нужен «номер сообщения» для подавления дубликатов и способ их синхронизации для обоих концов.Взгляните на RFC 916.

...