logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak sprawdzić, które porty COM w PC są dostępne - Visual C++

rkarliko 17 Paź 2006 11:19 2807 7
REKLAMA
  • #1 3125052
    rkarliko
    Poziom 11  
    Posty: 21
    Ocena: 6
    Witam.

    Mam prosty programik na PC napisany w Visual C++, który komunikuje się z urządzeniem zewnętrznym przez port COM. Urzytkownik ma mieć możliwość wyboru portu i tu pojawia się problemik. Chciałbym aby w rozwijanej liście pojawiały się tylko te porty COM, które są dostępne w danym PC, na którym odpalamy programik, a nie cała lista zawierająca 9 pozycji. W tej chwili wygląda to tak:

    -dodanie COM'ów do listy:

    m_portCtrl.AddString("COM1");
    m_portCtrl.AddString("COM2");
    m_portCtrl.AddString("COM3");
    m_portCtrl.AddString("COM4");
    m_portCtrl.AddString("COM5");
    m_portCtrl.AddString("COM6");
    m_portCtrl.AddString("COM7");
    m_portCtrl.AddString("COM8");
    m_portCtrl.AddString("COM9");

    -otwarcie portu:

    param->m_portCtrl.GetLBText(param->m_portCtrl.GetCurSel(),param->m_port);

    param->portHandle = CreateFile( (LPCTSTR)param->m_port,
    GENERIC_READ | GENERIC_WRITE,
    0,
    0,
    OPEN_EXISTING,
    0,
    NULL
    );

    Doda, żę moja wiedza na temat programowania w Visual jest praktycznie zerowa - niestety nie ja pisałem program, a osoba która to robiła jest teraz powiedzmy "niedostępna". Czy można zrobić to w prosty sposób, czy trzeba się ostro namęczyć?? Proszę o pomoc.

    Pozdrawiam. Robert
  • REKLAMA
  • #2 3125073
    przemo.t
    Poziom 27  
    Posty: 994
    Pomógł: 79
    Ocena: 30
    Niemal identyczny problem byl poruszny na elektrodzie calkiem niedawno...
  • REKLAMA
  • #3 3125170
    rkarliko
    Poziom 11  
    Posty: 21
    Ocena: 6
    Przed utowrzeniem nowego tematu przeszukałem ostatnie 10 stron forum (oczywiście działu Programowanie ogólne) i nie udało mi się znaleźć nic co przybliżyło by mnie do rozwiązania mojego problemu. Jest, co prawda, dużo info o RS232, ale nigdzie chyba nie ma poruszonej kwesti sprawdzania przed otwarciem portu, czy dany port istnieje - w końcu listę z wyborem portów tworzy się bezpośrednio po odpaleniu programu, a komunikację, a więc otwarcie portu, wykonuje się po tym jak urzytkownik wybierze już któryś z portów COM. Jeśli jednak przegapiłem na forum wyjaśnienie tego problemu to proszę o linka.

    Pozdrawiam. Robert
  • #4 3125244
    przemo.t
    Poziom 27  
    Posty: 994
    Pomógł: 79
    Ocena: 30
    Linka podam jak wroce do chaty, teraz szukajka nie dziala, bylo napewno bo sam odpowiadalem w tym temacie. Mozesz leciec po kolei i probowac otwierac porty COM, jesli sie nie uda otworzyc to znaczy ze nie jest dostepny (moze go nie byc fizycznie lub jakas aplikacja juz z niego korzysta)
  • REKLAMA
  • #5 3125272
    rkarliko
    Poziom 11  
    Posty: 21
    Ocena: 6
    Jest to jakiś pomysł, ale nie wiem jak zamknąć otwarty port COM, aby móc dalej sprawdzać kolejne porty lub po sprawdzeniu wszystkich portów przejść do kolejnego "etapu" programu, gdzie użytkownik sam wybierze port z którego chce skorzystać. Jeśli mógłbyś pokazać jak powinien wyglądać taki kod w mojej aplikacji to byłbym wdzięczny.
  • REKLAMA
  • Pomocny post
    #6 3125327
    przemo.t
    Poziom 27  
    Posty: 994
    Pomógł: 79
    Ocena: 30
    Przesledz ta strone http://www.codeproject.com/system/chaiyasit_t.asp , nie czytalem jej calej ale wyglada na to ze tam jest rozwiazanie. Ja zawsze korzystam z gotowych kontrolek do obslugi portow, po co sie bawic w pisanie czegos co jest napisane i dziala calkiem fajnie. W Twoim przykladzie dostajesz sie do portu poprzez WinAPI i komende CreateFile,
    Zamykasz port tak
        if(CloseHandle(handlePort_) == 0)    // Call this function to close port.
        {
          AfxMessageBox("Port Closeing isn't successed.");
          return FALSE;
        }
  • #7 3125373
    rkarliko
    Poziom 11  
    Posty: 21
    Ocena: 6
    Na początek zobaczę, czy to zadziała, ale chciałbym zrobić to mniej "brutalnie". Poprosił bym więc o tego linka lub gotowe rozwiązanie

    Pozdro.
  • #8 3132597
    nowyjar
    Poziom 12  
    Posty: 90
    Ocena: 4
    Jak Ci sie przyda, to ostatnio sklicilem w C++ taki kod ktory tworzy liste TComboBox z portami:
    unsigned long lpcValueName;
    HKEY klucz, podklucz;
    //********
    klucz=HKEY_LOCAL_MACHINE;
    DWORD dwMaxName, dwMaxData, dwMaxIndex;
    
    if(RegOpenKeyEx(klucz, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_ALL_ACCESS, &podklucz)!= ERROR_SUCCESS)
            Application->MessageBox("Can't open Key: HARDWARE\\DEVICEMAP\\SERIALCOMM", "Error", MB_OK);
    if(RegQueryInfoKey(podklucz, NULL, NULL, NULL, NULL, NULL, NULL, &dwMaxIndex, &dwMaxName, &dwMaxData, 0, 0) != ERROR_SUCCESS)
    Application->MessageBox("Can't read &dwMaxIndex, &dwMaxName, &dwMaxData", "Error", MB_OK);
    
    ++dwMaxName;
    ++dwMaxData;
    DWORD dwMaxName_ = dwMaxName, dwMaxData_ = dwMaxData;
    char* ValueName = (char*)GlobalAlloc(GMEM_FIXED, dwMaxName);
    char* Data = (char*)GlobalAlloc(GMEM_FIXED, dwMaxData);
    DWORD ValueType;
    long result;
    for(DWORD i=0; i<dwMaxIndex; ++i)
    {
    dwMaxName = dwMaxName_;
    dwMaxData = dwMaxData_;
    result = RegEnumValue(podklucz, i, ValueName, &dwMaxName, NULL, &ValueType, (LPBYTE)Data, &dwMaxData);
    if(result == ERROR_SUCCESS)
     {
    PortBox->Items->Add(Data);
     } else ShowMessage("Error");
    }
    GlobalFree(ValueName);
    GlobalFree(Data);
    odczyt();
    

    Pozdrawiam

Podsumowanie tematu

✨ Dyskusja dotyczy problemu dynamicznego wykrywania dostępnych portów COM w aplikacji napisanej w Visual C++. Autor chce, aby lista rozwijana zawierała tylko faktycznie dostępne porty, a nie stałą listę od COM1 do COM9. Proponowane rozwiązania obejmują próbę otwarcia kolejnych portów za pomocą funkcji WinAPI CreateFile i sprawdzenie, czy otwarcie się powiodło, co wskazuje na dostępność portu. Wskazano również konieczność zamknięcia portu po próbie otwarcia za pomocą CloseHandle, aby umożliwić dalsze testy. Alternatywnie zasugerowano odczytanie dostępnych portów z rejestru systemowego Windows pod kluczem "HARDWAREDEVICEMAPSERIALCOMM", co pozwala na pobranie listy faktycznie zainstalowanych i aktywnych portów COM. Podano fragmenty kodu w C++ do odczytu rejestru i zarządzania portami. Wskazano także na możliwość użycia gotowych kontrolek do obsługi portów szeregowych, co może uprościć implementację.
Wygenerowane przez model językowy.
REKLAMA