Żaśmiecona transmisja USB
Wynika to z tego że po podłączeniu FT232 tworzony jest wirtualny port szeregowy widoczny w menadżerze urządzeń w portach COM i LPT. Gdy konwerter zostanie odłączony system zwalnia pamięć po sterowniku wirtualnego portu i program nie ma się do czego odwołać. Najbezpieczniej będzie odłączać kabel USB po zamknięciu otwartego portu. Przy sprzętowym RS232 taki problem nie występuje. Być może aby obsłużyć wyjątek zamiast instrukcji: "begin else end" należy zastosować "try finally end" lub "try except end"
Błąd pojawia sie w procedurze obsługi CPORT
Błąd występuje, gdy nie może obsłużyć uchwytu. Może zamiast EcomPort.Create wpisać inną, własną obsługę błędu?
Kod: Zaznacz cały
procedure TCustomComPort.CreateHandle;
begin
FHandle := CreateFile(
PChar('\\.\' + FPort),
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
if FHandle = INVALID_HANDLE_VALUE then
raise EComPort.Create(CError_OpenFailed, GetLastError); //tu wskazuje błąd!!!
end;
Przecież jest to metoda na otwarcie portu, więc co to ma wspólnego z odłączeniem konwertera?
Być może kompilator pokazuje w tym miejscu błąd, tylko że port zostaje wcześniej otwarty. Po odłączeniu konwertera błędy powodowane są przez funkcje które odwołują się do uchwytu (zapis, odczyt do pliku itp.) pliku którego już w systemie niema (zwolniony adres).
Być może kompilator pokazuje w tym miejscu błąd, tylko że port zostaje wcześniej otwarty. Po odłączeniu konwertera błędy powodowane są przez funkcje które odwołują się do uchwytu (zapis, odczyt do pliku itp.) pliku którego już w systemie niema (zwolniony adres).
No dobra, tylko jak ten wyjątek obsłużyć? Nie znam tak dobrze komponentu ComPort. Wszelkie działania w moim programie nie przynoszą rezultatu, ponieważ jakiekolwiek odwołanie do komponentu ComPort przy niepodłączonym urządzeniu wywala od razu byka, a przynajmniej ComPort1.Open; i ComPort1.WriteStr().
Próbowałem dopisać coś w tym miejscu, co wskazałem wyżej, ale tam wiele rzeczy nie działa, co w normalnym programie i byki wywala.
Próbowałem dopisać coś w tym miejscu, co wskazałem wyżej, ale tam wiele rzeczy nie działa, co w normalnym programie i byki wywala.
Gdy konwerter jest niepodłączony to po prostu "nie ma pliku urządzenia" w systemie, a parametr OPEN_EXISTING determinuje przecież że plik musi istnieć. Klasa TComPort oferuje metodę na sprawdzenie ilości dostępnych portów com w tym wirtualnych. Bodajże EmumComPort(), która sprawdza klucze rejestru, a typem zwracanym jest TstringList (przez wartość) z nazwami dostępnych portów i jest typem dynamicznym. Z poszczególnych linii należy wyprasować nazwy portów.
A mam jeszcze pytanie co do Bascoma. Ponieważ na odbiór danych muszę zadeklarować sporą zmienna typu String, chciałbym zwolnić troche pamięci, przeznaczonej na stosy, których nie używam (tak myślę). Czy pisząc:
rzeczywiście zwolnię troche pamieci? Czytałem, że stos programowy i ilość ramek nie są używane, gdy nie stosuje się instrukcji SUB i FUNCTION?
Kod: Zaznacz cały
$hwstack=64
$swstack=2
$framesize=2
SoftStack jest używany dla zmiennych lokalnych (ich adresy). Czyli dwa bajty na zmienną lub parametr przekazywany procedury lub funkcji. FrameSize przechowuje zmienne lokalne, przykładowo dla jednakowego typu zmiennych: FrameSize= (ilość zmiennych*(pojemność użytego typu)). Dla dwóch zmiennych typu Byte, jednej Word i String*5: FrameSize=(2*1)+(1*2)+(1*6)=10. To że w programie programista nie definiuje procedur czy funkcji nie oznacza że z nich nie korzysta, przykładem są funkcje Hex(), Bin() .itp. 255 to maksymalna długość Stringu w Bascom AVR, deklarując taką zmienną w AtMega16 zostaje jeszcze trzy czwarte SRAM'u-1bajt.