Производитель / Потребитель Для Общения с Устройствами Серийно - PullRequest
6 голосов
/ 19 января 2010

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

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

  2. Если устройство отправляет мне что-то, обработайте сообщение, подтвердите и сообщите устройству о необходимости выполнения других команд

Прямо сейчас у меня есть поток приема и поток передачи. Получающий поток имеет цикл while, который продолжает проверять последовательный порт через ReadFile (...) на один байт. Если у меня есть байт, я начинаю создавать свой буфер и затем анализировать данные, чтобы определить, что было отправлено мне.

Поток отправки принимает следующую команду, определенную потоком чтения, и отправляет ее через WriteFile на тот же COM-порт. Ключ в том, что между мной и устройством существуют отношения приема / отправки.

У меня вопрос, есть ли у меня здесь вложенная модель Производитель / Потребитель? Если мой принимающий поток потребляет от устройства, а отправляющий поток производит на устройство, потоки должны по своей природе общаться, чтобы они были синхронизированы, верно? Каков наилучший способ синхронизировать мои усилия для эффективного и быстрого общения с устройством? Примечание: я использую C ++ Builder 5, который имеет TThreads и может использовать критические секции и мьютексы.

Редактировать: я также использую опрос, поэтому я открыт для использования WaitCommEvent, если это будет работать лучше!

1 Ответ

1 голос
/ 19 января 2010

Какими ресурсами вы делитесь, что, по вашему мнению, нужно синхронизировать?

Если у вас есть что-то вроде очереди между двумя потоками, то это довольно классическая модель производитель / потребитель. НАПРИМЕР. Если у вас есть только один поток, который читает и затем помещает команды в очередь, в то время как другой поток извлекает из очереди, обрабатывает команду и записывает на устройство, вам необходимо синхронизировать доступ к очереди с мьютексом или семафором.

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

...