Чтение с двух последовательных портов одновременно в c ++ - PullRequest
1 голос
/ 07 октября 2011

Операционная система, с которой я работаю - Windows 7. Мне нужно через определенные промежутки времени получать данные с широкополосной карты. Эта машина отправляет данные на два отдельных COM-порта. COM 3 и COM 4. Каждый интервал мне нужно будет запрашивать строку информации на обоих последовательных портах и ​​записывать их в файл.

Как читать с двух COM-портов? Должен ли я использовать потоки? Это хорошая практика, открывая оба одновременно?

Ответы [ 6 ]

2 голосов
/ 07 октября 2011

Взгляните на этот учебник .Если вы откроете ком-порт, а затем сделаете вызов WaitComEvent в перекрывающемся IO, вы получите дескриптор в OVERLAPPED , который можно использовать в WaitForMultipleObjects .

Вы должны быть в состоянии сделать это в одной теме с общей схемой ниже:

HANDLE hSerial3;
hSerial3 = CreateFile("COM3",
    GENERIC_READ | GENERIC_WRITE,
    0,0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
//...
WaitCommEvent(hSerial3, &dwEventMask, &ov3);
WaitCommEvent(hSerial4, &dwEventMask, &ov4);
//pack ov.hEvent into arHandler
WaitForMultipleObjects (3,arHandles,FALSE,INFINITE);

Сильно отредактировано благодаря обратной связи от @ JimRhodes

2 голосов
/ 07 октября 2011

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

0 голосов
/ 07 октября 2011

При общении с COM-портами всегда следует использовать многопоточность.

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

В данном конкретном случае использование нескольких потоков звучит как разумный выбор.

0 голосов
/ 07 октября 2011

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

Open COM3
Open COM4

LOOP
Check for data on COM3.
If data, read and process
Check for data on COM4.
If data, read and process
Sleep for remainder of polling interval
repeat from LOOP

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

Обработка данных в этом потоке или в другом зависит от многих деталей.

0 голосов
/ 07 октября 2011

Вам нужно открыть каждый порт в виде файла. Имена для использования будут «COM3:» и «COM4:». Вы захотите установить маску события (SetCommEvent) и создать поток для чтения с каждого порта. Вы используете WaitCommEvent в своем потоке и проверяете, относится ли событие к полученным данным. Если это так, вы используете ReadFile для чтения данных.

0 голосов
/ 07 октября 2011

вы можете проверить этот сайт дает пример http://www.fogma.co.uk/foggylog/archive/140.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...