Jak sprawdzić listę dostępnych portów COM w komputerze?

Odpowiedz Nowy wątek
2011-08-12 20:26
0

Witam serdecznie mam do napisania prostą aplikację w Delphi wysyłającą dane na aktywny port Com.
Dane wysłać i odpierać potrafię - przynajmniej jak na tę chwilę to działa :)
Niestety moja znajomość tego języka jest praktyczne zerowa, ale dzięki to tu, to tam znalezionych informacji, komunikacja działa i uzyskuję to co chcę.

Jednak w programie przydał by się jakiś choćby najmniejszy panel konfiguracyjny (numer portu COM prędkość - połącz/rozłącz itd.) Na razie mam wszystko ustawiane na sztywno we właściwościach.

Ale jak pobrać listę aktywnych portów? Tak abym miał tylko te do wyboru na liście?
Mam w kompie 2 przejściówki - na USB i tam ustawione COM10 i COM11. Ale to może się zmienić przecież. A głupio robić listę z wyborem 100-czy 200 COMów i zgadywać który może mieć użytkownik aktywny...
Samo Delphi przy wyborze właściwości COMu dla SerialPortu wie które są aktywne. Ale jak to uzyskać w programie?

Ewentualnie jak nie ma jak pobrać takiej listy, to jak sprawdzić czy próba otwarcia portu zwraca błąd, czy nie? Przy zwykłym otwarciu nieistniejącego portu program robi bum i się wywala. A nie znalazłem za bardzo informacji jak obsłużyć taki wyjątek. Ale to na pewno moja zerowa znajomość języka jest przyczyną.

Bardzo będę wdzięczny na wyrozumiałość, cierpliwość i pomoc.
Marcin

Pozostało 580 znaków

2011-08-12 20:52
0

przykład z javy - povinno być analogicznie:

Enumeration portList = CommPortIdentifier.getPortIdentifiers();
String defaultPort = "COM1";
 
    while (portList.hasMoreElements()) {
 
        CommPortIdentifier portId = (CommPortIdentifier) portList.nextElement();
 
            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
        if (portId.getName().equals(defaultPort)) {
            System.out.println("Found port " + defaultPort);
 
            portFound = true;
 
            try {
            serialPort = (SerialPort) portId.open("MojPrzesyl", 2000);
            } catch (PortInUseException e) {
            System.out.println("Port in use.");
 
            continue;
            } 

itd.

edytowany 3x, ostatnio: szypxx, 2011-08-12 21:07

Pozostało 580 znaków

2011-08-12 21:34
0

Ze źródeł ComPort

procedure EnumComPorts(Ports: TStrings);
var
  KeyHandle: HKEY;
  ErrCode, Index: Integer;
  ValueName, Data: string;
  ValueLen, DataLen, ValueType: DWORD;
  TmpPorts: TStringList;
begin
  ErrCode := RegOpenKeyEx(
    HKEY_LOCAL_MACHINE,
    'HARDWARE\DEVICEMAP\SERIALCOMM',
    0,
    KEY_READ,
    KeyHandle);
 
  if ErrCode <> ERROR_SUCCESS then
    raise EComPort.Create(CError_RegError, ErrCode);
 
  TmpPorts := TStringList.Create;
  try
    Index := 0;
    repeat
      ValueLen := 256;
      DataLen := 256;
      SetLength(ValueName, ValueLen);
      SetLength(Data, DataLen);
      ErrCode := RegEnumValue(
        KeyHandle,
        Index,
        PChar(ValueName),
{$IFDEF DELPHI_4_OR_HIGHER}
        Cardinal(ValueLen),
{$ELSE}
        ValueLen,
{$ENDIF}
        nil,
        @ValueType,
        PByte(PChar(Data)),
        @DataLen);
 
      if ErrCode = ERROR_SUCCESS then
      begin
        SetLength(Data, DataLen);
        TmpPorts.Add(Data);
        Inc(Index);
      end
      else
        if ErrCode <> ERROR_NO_MORE_ITEMS then
          raise EComPort.Create(CError_RegError, ErrCode);
 
    until (ErrCode <> ERROR_SUCCESS) ;
 
    TmpPorts.Sort;
    Ports.Assign(TmpPorts);
  finally
    RegCloseKey(KeyHandle);
    TmpPorts.Free;
  end;
 
end;

- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
Analogicznie :) - szypxx 2011-08-12 23:46

Pozostało 580 znaków

2011-08-12 22:58
0

Misiekd Dzięki za chęć pomocy...
Niestety nie wiem jak to ugryźć z moją wiedzą o tym języku.
Procedura ta wywala błędy przy kompilacji.

Rozumiem to w ten sposób, iż do zmiennej jest pobierany łańcuch z rejestru systemowego Windowsa. Z którego mają być wyciągnięte wpisy o COMach. Ale nie rozumiem jak. Zmienna to INT i wklejona do Memo zwraca jedynie 0
A aktywne są w tej chwili 3 COMy - jeden Fizyczny z przejściówki i 2 wirtualne połączone programowo.

Możesz to jako konkretny przykład przedstawić?
Będę dozgonnie wdzięczny!

Pozostało 580 znaków

2011-08-12 23:51
0

JAKI BŁĄD????????????????????????????????????????????????????????????????????????????????????

a co do wykorzystania to
EnumComPorts(Memo.Lines);


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-08-13 00:55
0

Można w pętli For sprawdzić istnienie i dostępność portów przez użycie funkcji CreateFile i jeśli funkcja nie zwróci INVALID_HANDLE_VALUE, to port istnieje i jest wolny.
Jeśli natomiast chciałbyś sprawdzić samo istnienie portów (nawet gdyby któryś z nich był zajęty przez inną aplikację), to możesz wykorzystać funkcję API GetDefaultCommConfig i w strukturze TCommConfig sprawdzać wartość dcb.BaudRate, jeśli będzie większa od 0 to znaczy, że port istnieje, choć może być w użyciu.

Obie metody nie należą do najszybszych, bo iteracja po 256 portach trwa kilka sekund, więc sam ocenisz, czy możesz chwilę poczekać na rezultat skanowania portów.

Pozostało 580 znaków

2011-08-15 12:05
0

Dzięki! Udało się :)

edytowany 1x, ostatnio: marciu11, 2011-08-15 13:58

Pozostało 580 znaków

2014-05-05 13:54
0

Witam!

Zastosowałem powyższy kod. Jednak gdy chcę sobie zwrócić daną wartość z listy portów to wypluwa mi błąd:

Access violation at address 004D82F8 in module 'nazwa'. Read of address 000000000.
Mam Delphi w wersji 2010 i Win7.

Czy ktoś może mi pomóc rozwiązać problem?

Pozdrawiam!
Patryk

edytowany 1x, ostatnio: furious programming, 2014-05-05 17:15
Więc pokaż jak to chcesz - kod. - _13th_Dragon 2014-05-05 14:14

Pozostało 580 znaków

2014-05-05 14:32
0

Dziękuję za zainteresowanie, jednak udało mi się to rozwiązać tak prosto, że aż wstyd. Zauważyłem, że w komponentach do CPortu jest ComboBox, w którym można wybrać Dostępne Porty COM w OS;)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0