Skocz do zawartości

Pilnie potrzebuję obsługę Portu LPT


dzelo3

Rekomendowane odpowiedzi

witam, mam duży problem, a mało czasu...

potrzebuję wysterować 4 złącza na gnieździe LPT

 

znalazłem kilka materiałów w internecie, jednak jestem zbyt zielony aby je wykorzystać...

najlepiej prosiłbym o gotowe rozwiązanie... ;/ w grę wchodzi tylko GameMaker...

wiem, że o wiele prosze, ale mam naprawdę mało czasu na wykonanie tego...

 

znalezione materiały :

 

http://gmc.yoyogames.com/index.php?showtopic=360653

http://gmc.yoyogames.com/?showtopic=165308 - od Tymona

 

linki do bibliotek :

 

IO - http://www.geekhideout.com/iodll.shtml

Inpout32 - http://logix4u.net/component/content/artic...dows-982000ntxp

Odnośnik do komentarza
Udostępnij na innych stronach

emm... zaimportowałem skrypt do gm8.0 ...

na start wyskakuje błąd :

___________________________________________

ERROR in

action number 1

of Create Event

for object object0:

 

Error defining an external function.

 

 

wtedy ignoruje to 16 razy (tyle ile dll ma funkcji) po czym wyskakuje message 'blad' czyli nie chce sie wczytac dll...

co jest źle ?

Odnośnik do komentarza
Udostępnij na innych stronach

Wypakowałeś DLLa?

 

EDIT

Już wiem o co cho. Przekompiluję DLLa później.

 

EDIT 2

https://gmclan.org/up152_3_iogm.html

Ale obawiam się, że nie będzie to działać na nowszych systemach.

 

Generalnie z tego co czytałem w ogóle jest to problematyczne na nowszych systemach.

Odnośnik do komentarza
Udostępnij na innych stronach

mam windows XP sp3

dll ładuje się poprawnie, jednak funkcja io_is_driver_installed() wywala -1 czyli chyba coś jest nie tak...

 

nie jestem też pewien czy dobrze adresuje port... przy jakichś demkach pisanych w delphi wyszło na to że moje gniazdo to LPT1 (378-37F)

więc zapisuje np.

 

io_set_port_bit('378-37F',8)

 

ale nie działa(raczej)

przynajmniej jak bróbowałem wszystkie czyścić i wszystkie ustawiać...

 

mam do gniazda podpięte 4 diody które przy demkach z delphi działały ale z gm nie chcą działać...

 

załączam plik gmk w którym uruchamiam wszystko.

dziwnie to działa... jak wyczyszcze i ustawie, to bity 32 i 128 mają wartość -1 a reszta nic...

 

https://gmclan.org/up6064_4_io_dll_gmk.html

Odnośnik do komentarza
Udostępnij na innych stronach

378-37F to zakres adresów w hexach. A io_is_driver_installed zwraca co ma zwracać - musisz sprawdzić na stronie z której to pochodzi o co chodzi.

 

IsDriverInstalled

Returns non-zero if io.dll is installed and functioning. The primary purpose of this function is to ensure that the kernel mode driver for NT/2000/XP has been installed and is accessible.

Odnośnik do komentarza
Udostępnij na innych stronach

378 to pierwszy port LPT 1, 37F to jego ostatni. Przeleć od początku do końca co się dzieje na portach to się dowiesz. Ja nie znam się na LPT.

 

EDIT

8 portów na dane i w sumie by się zgadzało. http://pl.wikipedia.org/wiki/IEEE_1284

 

Hint. Adresy portów podajesz jako liczbę, nie jako tekst.

Odnośnik do komentarza
Udostępnij na innych stronach

wychodzi na to że jest to 378, gdyż w przykładzie napisanym w delphi z kolei do zlportio.sys tak jest i działa...

ale mi to za cholere nie chce wyjść, próbuje jako word, jako bit, i nic nie reaguje...

 

tu jest kod z delphi na 90% działający z tym , że do innego sterownika:

 

 

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Zlportio, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
const
  LPTdata=$378;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
if ZLIOStarted then
   Label1.Caption := 'Sterownik załadowany poprawnie.'
else
   Label1.Caption := 'Nie można załadować sterownika.';
portwriteb(LPTdata,$10);    // wpisanie wartosci 00010000 (bin)
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var   b:byte;
begin
  b:=portreadb(LPTdata);          // czytamy bieżącą wartość
  b:=b shl 1;                     // przesuwamy w lewo o jeden
  if b=0 then b:=$10;             // warunek przekroczenia zakresu
  portwriteb(LPTdata,b);          // wpisujemy nową wartość
  Label2.Caption:=IntToStr(b);    // kontrolnie wypisujemy liczbę
end;

end.

 

napisałbyś coś z tego, gotowe do odpalenia i działające ? ;/ wtedy już dam sobie rade i zostawie cię w spokoju ;P

Odnośnik do komentarza
Udostępnij na innych stronach

W zasadzie to:

GML
io_port_out( $378, $10 );
Powinno robić to samo co:
portwriteb($378,$10);

Jeśli to nie działa to może coś z IO jest nie tak - tak jak mówiłem, Windowsy zbytnio się w to mieszają.

 

Ostatecznie napiszę coś innego, ale będziesz musiał to Ty testować, ja nie mam jak.

Odnośnik do komentarza
Udostępnij na innych stronach

ok działa, jestem wniebowzięty :D

 

teraz tylko czemu to ma być $10 ?

 

i jaki styk jaką będzie miał wartość ?

 

myślałem że to będzie 1,2,4,8,16,32,64,128...

a tutaj nagle 10. czy może to jest w systemie binarnym ?

Odnośnik do komentarza
Udostępnij na innych stronach

Dziesiętne 1, 2, 4, 8, 16, 32, 64, 128 to kolejno 1, 10, 100, 1000, 10000, 100000, 1000000 w binarnym, zaś heksadecymalne $10 to 16 w dziesiętnym czyli 10000 w binarnym.

 

$378 to pierwszy port, $379 drugi, $37A trzeci... $37F ósmy.

 

Każdy port jest 8 bitowy, czyli używasz io_port_out do manipulacją bitów portu. io_port_word_out nadpisze dwa porty, io_port_dword_out cztery - zaczynając od wskazanego.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie oktadecymalne tylko hexadecymalne.

 

GML (dectohex)
var _dec, _hex, _r;

_dec = floor( argument0 );

_hex = '';

while( _dec != 0 ) {

_r = _dec & 15;

if( _r > 9 ) {

_hex = chr( _r + 55 ) + _hex;

}

else {

_hex += chr( _r + 48 ) + _hex;

}

_dec = _dec >> 4;

}

return _hex;

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...