LPT - inpout32.dll

0

Dowiedziałem się że dostęp do portu LPT bez sterowników jest "zabroniony" wiele osób sugeruje żeby użyć bibloteki "inpout32.dll". napisałem to, zdaje się, poprawnie - wiem że jeszce nic nie robi.. poza błedem tej treśći:
"The value of ESP was not properly saved across the function call"

Co mam zrobić?! oto felerny kod:

typedef USHORT (InPortType) (USHORT BasePort);
typedef void   (OutPortType)(USHORT BasePort, USHORT value);

	HMODULE hDLL;
	InPortType* InPort = 0;
	OutPortType*OutPort = 0;

	{
		hDLL = LoadLibrary("inpout32.dll");

		Sleep(100);
		if(!hDLL)					{ MessageBox(0,"nie mogę znaleść bibloteki \"inpout32.dll\"\nprogram zostanie zakończony","brak *.dll",0); return -1;}

		InPort = (InPortType*)::GetProcAddress((HMODULE)hDLL,"Inp32");
		OutPort=(OutPortType*)::GetProcAddress((HMODULE)hDLL,"Out32");

		if(OutPort==0 ||
			InPort==0)
		{ MessageBox(0,"\"inpout32.dll\" jest nie poprawny!\nprogram zostanie zakończony","brak *.dll",0); return -1;}
	}

	Sleep(100);

	//standardowy port szeregowy - chyba LPT
	USHORT PortAddrerss = 0x378;

	#define LPT_DATA 0x378
	#define LPT_CONTROL LPT_DATA + 2


	//Ustawienie wartości Value na porcie o adresie określonym przez PortAddress.
	(*OutPort)(NULL,  NULL);

lub

 var   
    hLPT:HWND;   
    ret:dword;   
    data:integer; // tu będą zapisywane dane wysyłane na port 
begin    
    hLPT:=CreateFile('LPT1',GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);        
    data:=1;      //00000001 binarnie czyli syg "1" na pinie zerowym (D0)       
    WriteFile(hLPT,data,1,ret,nil);     
    data:=8; // 00001000 binarnie czyli syg "1" na pinie trzecim (D3)         
    WriteFile(hLPT,data,1,ret,nil);    
    data:=0; // czyli wyzerowanie portu     
    WriteFile(hLPT,data,1,ret,nil);     
    CloseHandle(hLPT);  //zamknięcie portu 
end;

ale ten kod naturalnie nie może działaś bo - dostęp do portu jest zabrnoniony..

Może mi ktoś pomóc?

0

Dlaczego drugie rozwiazanie nie moze dzialac ?? Dlaczego port jest zablokowany.

Stosowanie jakis bibliotek typu input32 albo ZLPortIO to raczej ostatecznosc (jak sie nie da inaczej), lepiej stoswac CreatFIle (bardziej przenosne i nie wymaga zawracania glowy administartorowi o ile LPT jest udostepniony)

0

poza błedem tej treśći:
"The value of ESP was not properly saved across the function call"

Problem leży w definicji:

typedef USHORT (InPortType) (USHORT BasePort);
typedef void   (OutPortType)(USHORT BasePort, USHORT value);

musisz dokładnie określić konwencję wywołania - prawdopodobnie __stdcall, ale może być inna.

0

ekhm... co to ma być?

typedef USHORT (InPortType) (USHORT BasePort);
typedef void   (OutPortType)(USHORT BasePort, USHORT value);
//...
InPortType* InPort = 0;
OutPortType*OutPort = 0;
//...
InPort = (InPortType*)::GetProcAddress((HMODULE)hDLL,"Inp32");
OutPort=(OutPortType*)::GetProcAddress((HMODULE)hDLL,"Out32");

Wskaźnik na funkcję /bo to chcesz/ uzyskać deklaruje się z '*':

typedef USHORT (*InPortType) (USHORT BasePort);
typedef void   (*OutPortType)(USHORT BasePort, USHORT value);

więc dalej...

InPortType InPort;;
OutPortType OutPort;
//...
InPort = (InPortType)::GetProcAddress((HMODULE)hDLL,"Inp32");
OutPort=(OutPortType)::GetProcAddress((HMODULE)hDLL,"Out32");

Natomiast tego ni w ząb nie łapę:

        USHORT PortAddrerss = 0x378;

        #define LPT_DATA 0x378
        #define LPT_CONTROL LPT_DATA + 2


        //Ustawienie wartości Value na porcie o adresie określonym przez PortAddress.
        (*OutPort)(NULL,  NULL);

w każdym razie funkcję w tym wypadku wywołuje się tak /po powyższych poprawkach/:

OutPort (NULL,  NULL);

//standardowy port szeregowy - chyba LPT

Szeregowy to RS232 jest, LPT domyślnie jest równoległy...
Btw. na goriona Sleep? LoadLibrary powraca dopiero po zainicjowaniu modułu :|

0

ok wiec:

typedef USHORT _stdcall (*InPortType) (USHORT BasePort);
typedef void   _stdcall (*OutPortType)(USHORT BasePort, USHORT value);

tak zapewne tu jest błąd... ale jak ort! to w takiej wersji to mam:

error C2059: syntax error : '('
error C2059: syntax error : '('

;-( CO TO JEST?! POMOCY :/

0
typedef USHORT (__stdcall *InPortType) (USHORT);
typedef void (__stdcall *OutPortType)(USHORT, USHORT);
0

Dobra panowie mam:

	typedef short (_stdcall *InPortType) (USHORT);
	typedef void  (_stdcall *OUTPortType)(USHORT, USHORT);
	 
	HINSTANCE hDLL;
	InPortType  InPort;
	OUTPortType OutPort;

	short x;
	int i;
	{
		/* Load the library */ 
		hDLL = LoadLibrary("inpout32.dll"); 

		if (hDLL == NULL) return -1; 

		/* get the address of the function */ 
		InPort = (InPortType) GetProcAddress(hDLL, "Inp32"); 

		if (InPort == NULL) return -1;


		OutPort = (OUTPortType) GetProcAddress(hDLL, "Out32"); 

		if (OutPort == NULL)	return -1; 
	}

	i=0x378; 
	x=0x77; 

	for(int a=0;a<1000;a++)
	OutPort(i,(SHORT)a);

I, jak zawsze u mnie.. problem:P

pisząc to:

	for(int a=0;a<1000;a++)
	OutPort(i,(SHORT)a);

miałem nadzieje ze diody które powtykałem do drugiego końca kabla od drukarki.. zrobią "coś".. czy ja znowu robie coś nie tak?

0

Może i "coś" zrobią, ale w parę milisekund :P Jak już to:

for(int a=0;a<8;a++)
{
    OutPort(i,(SHORT)1<<a);
    Sleep(500);
}
0

Dzięki wszystkim za pomoc!

reichel - nie testuje juz tego "drugiero" rozwiązania
0x666 - jesteś moim guruD! działaD
deus - piszesz naprawde przejrzyste kody! dzieki
naprawde moło komu chce się wklepać poprawny kod ale Ty:)
Jesteś lepszy:] dzieki

0

Wie ktoś jakich diod i oporników należy użyć, żeby nie spalić portu LPT1?

0
  1. Przepuść przez diodę 5 - 20mA i zmierz spadek napięcia na niej.
  2. Odejmij ten spadek napięcia od 5V i podziel wynik przez prąd, a wyjdzie wartość opornika :)
0
<quote> for(int a=0;a<8;a++) { OutPort(i,(SHORT)1<a); sleep(500); } </quote="Sleep(500); } &lt;/quote">

hmm...

Czyli za każdym razem jak wysyłam słowo na port, to pojawia się przez ułamek sekundy napięcie na odpowiednich pinach. Jeśli chcę utrzymać napięcie przez dłuższy czas, to muszę uśpić wątek. Czyli jeśli wyślę słowo, które "zapali" mi powiedzmy 2 i 3 pin, i chcę poczekać 1000ms i potem "zgasić" tylko 3 pin, to taka operacja jest niemożliwa? Bo przecież w drugiej kolejności muszę wysłać dane zapalające tylko 2 pin, a w między czasie na ułamek sekundy on "zgaśnie".

Mam rację?
Jeśli tak to jak to obejść (zapalanie, gaszenie pinów bez spadków napięcia na innych)?

0

Czyli za każdym razem jak wysyłam słowo na port, to pojawia się przez ułamek sekundy napięcie na odpowiednich pinach.

O ile dobrze pamiętam to port LPT ma na wyjściu rejestry zatrzaskowe więc stan zostanie zachowany do następnej zmiany.

0
0x666 napisał(a)

Czyli za każdym razem jak wysyłam słowo na port, to pojawia się przez ułamek sekundy napięcie na odpowiednich pinach.

O ile dobrze pamiętam to port LPT ma na wyjściu rejestry zatrzaskowe więc stan zostanie zachowany do następnej zmiany.

...więc po co sleep() w kodzie?

0

Heh napisałem, że "zostanie zachowany do następnej zmiany". Bez sleep zmiany nastąpią tak szybko, że nie zauważysz - nawet jakbyś miał dobre oko to dioda też potrzebuje trochę czasu żeby się "rozpalić". Z drugiej strony, LPT ma ograniczoną przepustowość.

0
0x666 napisał(a)

Heh napisałem, że "zostanie zachowany do następnej zmiany". Bez sleep zmiany nastąpią tak szybko, że nie zauważysz - nawet jakbyś miał dobre oko to dioda też potrzebuje trochę czasu żeby się "rozpalić". Z drugiej strony, LPT ma ograniczoną przepustowość.

Czyli jeśli wyślę tylko OutPort() zapalający jeden PIN i nic po nim nie wyślę to napięcie będzie się utrzymywać na nim do czasu następnej wysłanej komendy (podłączona dioda będzie się palić cały czas)?

0

O ile się nie mylę, to tak. Spróbuj to będziesz wiedział ;)

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