Как правильно определить все доступные последовательные порты в Windows? - PullRequest
6 голосов
/ 20 апреля 2010

Существует несколько способов составления списка последовательных портов в Windows, но я не уверен, что это правильный путь: способ, который обнаруживает все доступные последовательные порты.

Один хороший пример кода - http://www.naughter.com/enumser.html - где существует 9 (девять!) Способов перечисления последовательных устройств.

Вопрос в том, как оптимально это сделать.

Требования:

  • не открывать порты для проверки их доступности.
  • для возможности обнаружения портов с именами, отличными от COMx.
  • для работы на Windows XP SP2 или выше

Ответы [ 4 ]

5 голосов
/ 09 сентября 2013
void SelectComPort() //added function to find the present serial 
{

    TCHAR lpTargetPath[5000]; // buffer to store the path of the COMPORTS
    DWORD test;
    bool gotPort=0; // in case the port is not found

    for(int i=0; i<255; i++) // checking ports from COM0 to COM255
    {
        CString str;
        str.Format(_T("%d"),i);
        CString ComName=CString("COM") + CString(str); // converting to COM0, COM1, COM2

        test = QueryDosDevice(ComName, (LPSTR)lpTargetPath, 5000);

            // Test the return value and error if any
        if(test!=0) //QueryDosDevice returns zero if it didn't find an object
        {
            m_MyPort.AddString((CString)ComName); // add to the ComboBox
            gotPort=1; // found port
        }

        if(::GetLastError()==ERROR_INSUFFICIENT_BUFFER)
        {
            lpTargetPath[10000]; // in case the buffer got filled, increase size of the buffer.
            continue;
        }

    }

    if(!gotPort) // if not port
    m_MyPort.AddString((CString)"No Active Ports Found"); // to display error message incase no ports found

}
3 голосов
/ 10 февраля 2015

Если вы можете получить доступ к реестру, ключ HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM содержит список COM-портов, которые в настоящее время поддерживает Windows (в некоторых случаях эта информация может быть устаревшей / неправильной; например, я подозреваю, когда устройство Plug & Play предоставляет последовательный порт). порты не завершили обнаружение / установку или были недавно удалены).

Именно так метод .NET Framework SerialPort.GetPortNames() сообщает о доступных COM-портах, а приведенная выше информация получена со связанной страницы.

3 голосов
/ 20 апреля 2010

Последовательные порты - очень простые устройства, начиная с каменного века вычислительной техники. Они не поддерживают Plug & Play, нет никакого способа сказать, что кто-то подключил устройство. Единственное, что вы можете сделать, это узнать, какие порты доступны, SerialPort.GetPortNames () возвращает список. Некоторые эмуляторы USB могут генерировать описательное имя, совпадающее с именем порта, вы можете найти их с помощью WMI, класса Win32_SerialPort.

Ничто из этого не поможет вам определить, какой COM-порт подключен к определенному устройству. Только человек знает, она физически подключила кабель к разъему. Вам нужно будет предоставить интерфейс конфигурации, который позволит пользователю выбрать номер порта. Поле со списком выполняет свою работу. Сохраните выбор в данных конфигурации, вероятно, вероятно, что устройство все еще будет подключено к тому же порту при следующем запуске вашей программы.

0 голосов
/ 06 января 2016
CUIntArray ports;
EnumerateSerialPorts(ports);

for (int i = 0; i<ports.GetSize(); i++)
{
    CString str;
    str.Format(_T("COM%d"), ports.ElementAt(i));
    m_ctlPort.AddString(str);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...