Zamykanie nieistniejącego portu COM

0

Mam urządzenie które emuluje port COM (z wykorzystaniem kostki firmy FTDI - FT2232D). Łączę się z tym urządzeniem za pomocą własnej aplikacji wykorzystując komponent ComPort. Z chwilą odłączenia urządzenia od komputera port COM znika a próba jego zamknięcia poleceniem ComPort.Close powoduje wyświetlenie komunikatu o błędzie. Nic nie daje umieszczenie tego polecenia w konstrukcji try...except...end; Czy ktoś jest w stanie pomóc rozwiązać ten problem? Dzięki...

1

powoduje wyświetlenie komunikatu o błędzie. Nic nie daje umieszczenie tego polecenia w konstrukcji try...except...end;

A może to debugger łapie wyjątek. spróbuj uruchomić bez dbg.

0

ten problem jest nierozwiązywalny - tzn. w takim wypadku zawsze dostaniesz błąd kwestia tylko czy go obsłużysz

1

Spróbuj takiego sposobu, tzn. przed wywołaniem Close portu, sprawdź czy port istnieje:

Function ComPortExists(Port:String): Boolean; 
 Var
  Size: Cardinal;
  CommConfig:TCommConfig;
Begin
  Result:=false;
  FillChar(CommConfig, SizeOf(TCommConfig), 0);
  CommConfig.dwSize:=SizeOf(TCommConfig);
  Size:=SizeOf(TCommConfig);
  If GetDefaultCommConfig(PChar(Port), CommConfig, Size) //próba odczytu konfiguracji portu (bez prefixu \\.\)
    then Result:=(CommConfig.dcb.BaudRate > 0) //jeśli bitrate nie jest 0, to znaczy że port istnieje w systemie
    else If (GetDefaultCommConfig(PChar('\\.\'+Port), CommConfig, Size)) then Result:=(CommConfig.dcb.BaudRate > 0); //próba odczytu konfiguracji portu (z prefixem \\.\)
end;

Z moim FTDI działa:)

0

ale port i tak się zamyka (jeśli używasz tcomport) jak zamykasz aplikację

0

Problem wziął się stąd, że moja aplikacja wywala błąd w chwili kiedy ją zamykam nie zamykając uprzednio otwartego wcześniej portu COM (trochę to zamieszane) jak również w momencie gdy próbuję zamknąć port COM którego już nie ma (po wyłączeniu urządzenia które ten port emulowało). Zdaje sobie sprawę że wyjątek zawsze w takich przypadkach wystąpi. Chciałbym jednak żeby nie pojawiał się żaden komunikat wywalany przez system.

Sposób zaproponowany przez kolege marogo nie daje oczekiwanego rezultatu - w dalszym ciągu pokazuje się komunikat o błędzie w chwili wyłączenia aplikacji.

0

Może to błąd wywalany przez system w takim wypadku pozostaje:

var
  ErrorMode: Word;
begin
   //jakiś kod
   ErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS) ; //powoduje ze blad nie bedzie wyswietlany
   try
     //tu próba zamknięcia portu
   finally
     SetErrorMode(ErrorMode) ;
   end;
end;
0

Udało się rozwiązać problem z wykorzystaniem sposobu przedstawionego przez kolegę marogo. Początkowo sprawdzałem czy port istnieje funkcją ComPortExists i nie robiłem nic gdy portu nie było. Był to błąd. Teraz 'omijam' procedurę AbortAllAsync gdy funkcja ComPortExists zwróci False. Dziękuję wszystkim za pomoc!

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