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...
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.
ten problem jest nierozwiązywalny - tzn. w takim wypadku zawsze dostaniesz błąd kwestia tylko czy go obsłużysz
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:)
ale port i tak się zamyka (jeśli używasz tcomport) jak zamykasz aplikację
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.
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;
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!