Три коммуникационные программы COM портов в Visual Studio 2019 - PullRequest
0 голосов
/ 14 марта 2020

Если есть три COM-порта, например, COM10, COM11, COM12. Я хочу подключить все три новых COM-порта и последовательно передавать данные на COM10, COM11, COM12.

Должен ли я использовать CreateFile три раза?

// my source 
HANDLE              m_hComm;
m_hComm = CreateFile(szPort,                        // communication port string (COMX)
                     GENERIC_READ | GENERIC_WRITE,  // read/write types
                     0,                             // comm devices must be opened with exclusive access
                     NULL,                          // no security attributes
                     OPEN_EXISTING,                 // comm devices must use OPEN_EXISTING
                     FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,            // Async I/O
                     0);                            // template must be 0 for comm devices

Как установить значение дескриптора для каждого COM-порт, когда вы хотите передавать данные последовательно на COM10, COM11, COM12?

// my source 
n = WriteFile(m_hComm, pBuff, nToWrite, &dwWritten,&m_ovrWrite);

1 Ответ

0 голосов
/ 14 марта 2020

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

(Примечание: для COM-портов с индексом больше 9 вы должны использовать синтаксис " \\. \ COMxx ".)

Итак, чтобы открыть три порта вместе, вы можете использовать массив дескрипторов (и массив имен портов); например:

    char szPort[3][10] = { "\\\\.\\COM10", "\\\\.\\COM11", "\\\\.\\COM12" };
    HANDLE  m_hComm[3];
    for (int i = 0; i < 3; ++i) {
        m_hComm[i] = CreateFile(szPort[i], // communication port string (COMX)
            GENERIC_READ | GENERIC_WRITE,  // read/write types
            0,                             // comm devices must be opened with exclusive access
            NULL,                          // no security attributes
            OPEN_EXISTING,                 // comm devices must use OPEN_EXISTING
            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,            // Async I/O
            0);                            // template must be 0 for comm devices
    }

Затем вы можете отправлять данные на любой из открытых портов, используя соответствующее значение из массива m_hComm. Таким образом, чтобы отправить одинаковые данные на каждый из трех портов, вы можете использовать al oop, как показано ниже:

    for (int p = 0; p < 3; ++p) { // Loop to send the same data to all three ports...
        //...
        BOOL n = WriteFile(m_hComm[p], pBuff, nToWrite, &dwWritten, &m_ovrWrite);
        //...
    }

Пожалуйста, не стесняйтесь просить дальнейших разъяснений и / или объяснение.

...