WinAPI+ lpt

0

Witam. Mam pytanie do szanownych panów a właściwie kilka. Chciałem napisać program do obsługi diodek tak jak tu: http://wkretak.pl/readarticle.php?article_id=5 . Chciałem wykorzystać winapi poniewarz znalazłem kod gotowy a nie jestem zaawansowanym programistą.Na początku poszukałem w google i znalazłem kilka ciekawych artykułów. Wykorzystałem to w swoim programie. Na razie główna część wygląda następująco:

procedure TLPT.Button1Click(Sender: TObject);
var
 hLPT,Uchwyt : THandle; { uchwyt naszegoportu }
 ret : dword; { potrzebne na dane 'zwrotne' }
 blad:cardinal;


begin

 ShowMessage('Start programu, pobranie uchwytu do programu');
 hLPT := CreateFile('LPT1', GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0); {pobieramy uchwyt do portu :}
 ShowMessage('Sprawdzenie czy nie ma blędów')   ;
 Uchwyt := hLPT;
if Uchwyt = 0 then
 begin
   blad := GetLastError;
   ShowError(blad, 'Wywołanie funkcji "lpt" nie powiodło się. Przyczyna:') ;
   exit;
end ;

 ShowMessage('Brak bledów, można kontynlowac')  ;
 data := 0;
 If CheckBox1.Checked then data := data + 1;
 If CheckBox2.Checked then data := data + 2;
 If CheckBox3.Checked then data := data + 4;
 If CheckBox4.Checked then data := data + 8;
 If CheckBox5.Checked then data := data + 16;
 If CheckBox6.Checked then data := data + 32;
 If CheckBox7.Checked then data := data + 64;
 If CheckBox8.Checked then data := data + 128;
 SpinEdit1.Value:=data;
 ShowMessage('Zaraz nastąpi zapis do portu lpt' ) ;
 <b>WriteFile(hLPT, data, 1, ret, nil);  {tu sie wywala}</b>
 ShowMessage('Zapis ukończono!');
 SpinEdit1.Value:=data;
end;

procedure ShowError(Error: LongWord; Info: string);
var
  lpMsgBuf: PChar;
begin
  FormatMessage(
  FORMAT_MESSAGE_ALLOCATE_BUFFER or
  FORMAT_MESSAGE_FROM_SYSTEM or
  FORMAT_MESSAGE_IGNORE_INSERTS,
  nil, Error, LANG_NEUTRAL or (SUBLANG_DEFAULT shl 10),
  PChar(@lpMsgBuf), 0, nil );
  ShowMessage(Info + #10#13 + string(lpMsgBuf));
  LocalFree(Cardinal(lpMsgBuf));
end;

No i niby wszystko się kompiluje i powinno być ok. Ale na początku włączałem program na laptopie gdzie nie ma lpt. Wszystko działało. Ale schody zaczęły się dopiero wtedy jak program przeniosłem na inny komputer z lpt (p2 450mhz 128mgb ram'u winxpsp2) postawiłem na nim ten system tylko do zabawy z lpt (bo wiem że to trochę niebezpieczne )wiec nic innego na nim nie ma oprócz tych dogranych plików do win z tego artykułu u góry no i useport. Dodam też ze zbudowałem sobie układ na diodach i za pomocą dołączonego programu do artykułu na wkretak.pl sprawdziłem i diody się zapalały tak jak chciałem. Niestety mój program nie działa. A dokładnie objawia się to tym że diody się nie świecą a program sie zawiesza. Chciałem sprawdzić gdzie dokładnie więc dodałem te ShowMessage. Jak sie okazało program "wisi" podczas zapisu do portu, ale nie do końca. W desperacji zostawiłem go spokojnie po linijce: ShowMessage('Zaraz nastąpi zapis do portu lpt' ) ; no i ku mojemu zdziwieniu po kilku minutach! ujrzałem napis ShowMessage('Zapis ukończono!'); niestety żadna z diód sie nie zapaliła. Choć próbowałem kilkanaście razy. Zawsze następuje zawis programu na kilka minut dioda sie nie zapala niestety a napis się wyświetla. Mam więc pytania co robię nie tak, czy ten wykorzystany prze zemnie kod jest prawidłowy jeśli tak czy da się go w jakiś sposób poprawić żeby jednak ta diody sie zapalały. Na swoją obronę chciałem powiedzieć że dopiero zaczynam programować no i po kodzie widać że jednak trochę szukałem w internecie, może za słabo. dziękuje za dotarcie do końca. Pozdrawiam i proszę o pomoc.

0

Czesc.

Nie znam sie na portach ale skoro po kilku minutach napis sie pojawia to byc moze, nastepuje jakis TimeOut? (Uplywa limit czasu na polaczenie czy cos takiego.)
Musisz przede wszystkim sprawdzic jaki blad zwraca Ci funkcja WriteFile(hLPT, data, 1, ret, nil);
a tego nie robisz.
Sprawdz numer bledu, numer ten przetlumacz sobie na postac tekstowa i bedziesz wiedzial gdzie lezy przyczyna.

Powodzenia:)

0

Komputer probuje wyslac wiadomosc cos sie z nia dzieje i probuje robic to ponownie po kilkunastu razach wyrzuca błąd klasyczne działanie windowsa. Sposób działania: określić co jest przyczyną błędu. Niestety jestem uziemniony z lapkiem przez najbliższe 1,5 miesiąca więc Lpt nie przetestuje.

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