Zdroj: http://prochazka.clanweb.eu/index.php?a=programy/ovladacportu  •  Vydáno: 12.1.2008 17:11  •  Autor: hacesoft

Ovladač portu pod WinXP

Balík knihoven napsaných ve Visual Basicu 6 a Cecku pro komunikaci mezi Vaším programem a LPT portem pod WinNT systémy (Win2000 a WinXP).

Pokud se stane že program má problémy s přístupem na LPT port počítače, nebo neočekávané ukončil činnost, stáhnete si nejnovější verzi knihovna.dll a adresaportu.dll. z: www.prochazka.zde.cz
Po stáhnutí knihoven na počítač vyhledejte místo uložení programu a nakopírujte nejnovější verze. Není třeba restartovat počítač

Pomocí této knihovny můžete ve Visual Basicu a Céčku pracovat s LPT porty pod systémy Win2000 a WinXP. V Biosu nastavte LPT port na ECP + EPP. Další nastavení jako DMA a adresa portu, muže bit libovolná.

UPDATE: Verze: 1.9.1202.2006 knihovna.dll ze dne 14.2.2006.
******************************************************************************************

UPDATE: Verze: 5.3.531710 knihovna.dll ze dne 5.3.2005.
******************************************************************************************

UPDATE: Verze: 25.12.2041.4 knihovna.dll ze dne 25.12.2004.
******************************************************************************************

OPRAVY: Verze: 24.7.1855.4
******************************************************************************************

UPDATE: Verze: 1.5.08.11
******************************************************************************************

OPRAVY: Verze: 1.4.21.6
******************************************************************************************

OPRAVY: Verze: 1.3.21.4
******************************************************************************************

OPRAVY: Verze: 1.2.12.4
******************************************************************************************

OPRAVY: Verze: 1.1.60530.0
******************************************************************************************

----------------------------------------------------------------------------------------------------------------


Tento program, knihovna AdresaPortu.dll a knihovna.dll můžete používat neomezeně pro NEKOMERČNÍ účely.

POZOR: Důležitá poznámka: Všechny tři soubory (Knihovna.dll, AdresaPortu.dll a Giveio.sys) MUSÍ být ve stejném adresáři.

Ještě jedna poznámka: Ke knihovně KNIHOVNA.DLL musíte použít pouze knihovnu AdresaPortu.dll tu, která se nachází v tomto archívu. Jiná verze, nebude spolupracovat.

Současná verze KNIHOVNA.DLL je: 5.3.531710

Současná verze AdresaPortu je: 1.2.0.1306

Popis jednotlivých funkcí knihovny KNIHOVNA.DLL:

Funkce Error: vrátí podrobnější popis, proč určitá funkce selhala:

Funkce Cekat : Přesná čekací rutinka pro krátké časy. Co je ten krátký čas? - Doba po kterou procesor není vytížen na 100%. Například: 5000 ms je už velmi dlouhá doba, 100 ms = 0.1 s, je asi maximální rozumný čas pro čekání pomoci této funkce. Tuto funkci není dobré používat pro žádoucí zpoždění programu, pokud momentálně nepracujeme s paralelním portem. Vstupní parametr: doba čekání v milisekundách. Návratová hodnota: skutečná doba čekání v milisekundách. Pro přesné zjištění, jak dlouho se čekalo je třeba připočíst čas, který je zapotřebí pro zavolání a návrat z funkce Cekat. Tyto dvě hodnoty funkce není schopna zjistit. Je potřeba je vypočítat pomoci matematického vzorce, kde bude zohledněna rychlost procesoru. Pomocí předem zjištěného koeficientu je potřeba upravovat výsledek podle aktuální rychlosti procesoru. Koeficient je hodnota nebo počet instrukci které slouží pro zavolání funkce Cekat. Počet instrukcí se dá zjistit v assembleru, proto doporučuji si stanovit nějaký obecný koeficient. Ale zase výsledek bude přibližný, bude přesnější než když nebudete nic přičítat...

Funkce GET_DMA_PORT : Zjistí hodnotu DMA portu, na který jste se předtím dotazoval funkcí OpenPort. Není vyžadován žádní vstupní parametr. Pokud návratová hodnota je -1 tak funkce selhala nebo se jedná o port typu SPP nebo EPP pro které není k dispozici DMA.

Funkce GET_IRQ_PORT : Zjistí hodnotu IRQ portu, na který jste se předtím dotazoval funkcí OpenPort. Není vyžadován žádní vstupní parametr. Když funkce vrátí hodnotu -1, tak se nezdařila. Pro jakýkoliv typ portu je vždy k dispozici IRQ.

Funkce GET_TYPE_PORT : Zjistí typ portu. Pokud je návratová hodnota 2, jedna se o port SPP nebo EPP, když funkce vrátí hodnotu 4 potom je port typu ECP a jeho různé modifikace. Návratová hodnota -1 říká, že funkce selhala.

Funkce Chyba : Vrátí název chyby, která je reprezentována číslem chyby API funkce GetLastError(), v jazykové mutaci Windows (když máte MS Windows v češtině, tak chyba je také v češtině). Nevrací žádnou hodnotu. Vstupní parametr je pouze text, který bude zobrazen v titulku chyby. Toho lze využít při chybových hláškách, kde do titulku zadáte název aplikace nebo cokoliv co reprezentuje pravě vzniklý problém. Muže se také jednat o popis kde chyba vznikla, a podobně.

Funkce Dll_Register_Server : Zaregistruje ActiveX knihovnu do operačního systému. Parametr: Název registrované knihovny. Registrovaná knihovna musí bít ve stejném adresáři jako KNIHOVNA.DLL. Návratová hodnota: 0 znamená, že registrace proběhla OK. Hodnota -1, nepodařilo se zaregistrovat.

Funkce Dll_UnRegister_Server : Odhlásí ActiveX knihovnu z operačního systému. Parametr: Název registrované knihovny. Registrovaná knihovna musí bít ve stejném adresáři jako KNIHOVNA.DLL. Návratová hodnota: 0 znamená, že registrace proběhla OK. Hodnota -1, nepodařilo se zaregistrovat.

Funkce UnLock_ : Nainstaluje knihovnu AdresaPortu.dll (jedna se o knihovnu napsanou ActiveX technologii). Nainstaluje ovladač Giveio.sys a spustí ho. Použit před jakoukoliv komunikací paralelním portem. Návratová hodnota je nula, když funkce uspěla. Pokud je návratová hodnota jedna restartujte PC, nebo manuálně odstraňte službu giveio a znovu restartujte počítač. Potom můžete spustit program využívající služeb knihovny knihovna.dll.

Funkce Lock_ : Odinstaluje ze systému knihovnu AdresaPoru.dll. Zastaví ovladač Giveio.sys a odstraní ho ze systému, uklidí po sobě v registrech. Tuto funkci proveďte, když už nebudete potřebovat pracovat s paralelním portem.

Funkce Zapis : Zapíše byte (hodnotu v rozmezí 0 až 255) na určenou adresu. Parametry: Port : Kam zapsat. Data : Co zapsat. Vždy vrátí hodnotu, kam zapsal požadovaná data.

Funkce Cteni : Přečte hodnotu byte z určené adresy. Parametr: Port: Odkud číst. Vždy vrátí hodnotu, kterou přečetl z požadované adresy.

Funkce Zapis_Data : Zapíše byte na Adresu+Base (adresu kterou dodá knihovna AdresaPortu.dll). Base =0. Pokud požadovaný LPT port není otevřen (dotaz na LPT port), funkce vrátí hodnotu -1. Jinak vrátí adresu, na kterou požadovanou hodnotu zapsala. Parametr: Data: jakou hodnotu zapsat.

Funkce Zapis_Status : Zapíše byte na Adresu+Base (adresu kterou dodá knihovna AdresaPortu.dll). Base =1. Pokud požadovaný LPT port není otevřen (dotaz na LPT port), funkce vrátí hodnotu -1. Jinak vrátí adresu, na kterou požadovanou hodnotu zapsala. Parametr: Data: jakou hodnotu zapsat.

Funkce Zapis_Control : Zapíše byte na Adresu+Base (adresu kterou dodá knihovna AdresaPortu.dll). Base =2. Pokud požadovaný LPT port není otevřen (dotaz na LPT port), funkce vrátí hodnotu -1. Jinak vrátí adresu, na kterou požadovanou hodnotu zapsala. Parametr: Data: jakou hodnotu zapsat.

Funkce Ctení_Data : Přečte hodnotu byte z Adresy+Base (adresu kterou dodá knihovna AdresaPortu.dll). Base =0. Pokud požadovaný LPT port není otevřen(dotaz na LPT port), funkce vrátí hodnotu -1. Jinak vrátí hodnotu, kterou přečetla.

Funkce Ctení_Status : Přečte hodnotu byte z Adresy+Base (adresu kterou dodá knihovna AdresaPortu.dll). Base =1. Pokud požadovaný LPT port není otevřen(dotaz na LPT port), funkce vrátí hodnotu -1. Jinak vrátí hodnotu, kterou přečetla.

Funkce Ctení_Control : Přečte hodnotu byte z Adresy+Base (adresu kterou dodá knihovna AdresaPortu.dll). Base =2. Pokud požadovaný LPT port není otevřen(dotaz na LPT port), funkce vrátí hodnotu -1. Jinak vrátí hodnotu, kterou přečetla.

Funkce OpenPort : Otevře LPT port (Dotaz na LPT port). Tato funkce se volá z knihovny KNIHOVNA.DLL a ta pak volá knihovnu AdresaPortu.dll.

Vstupní parametry:Název Portu:Je to řetězec obsahující název portu.
 Rozsah:Uplatňuje se jen při hledání adresy LPT portu.
hodnota je 0 nebo 1. Nastavujte vždy hodnotu 0.

Popis funkce knihovny AdresaPortu.dll:

Tuto knihovnu si volá knihovna KNIHOVNA.DLL sama podle potřeby. V případe že chcete použít služby knihovny AdresaPortu.dll sami, nebo Vás zajímá její funkce, čtete dál.
Tato knihovna zjistí adresu LPT či COM portu (pouze fyzické porty, ne virtuální) a k tomu ještě přidá Typ Portu, DMA a IRQ.
Poslední tři funkce jsou k dispozici jak z knihovny AdresaPortu.dll tak i knihovna.dll. Takže je jedno, které funkce použijete. Ale volat API funkce z knihovna.dll je podstatně jednoduší než něco vydolovat a ActiveX (AdresaPortu.dll - Knihovna je napsaná ve VB6).

Vstupní parametry:Název Portu:Je to řetězec obsahující název portu.
Přípustné názvy:
LPT1, LPT2, LPT3 a LPT4
COM1, COM2, COM3 a COM4
Názvy musí být velkýma písmeny.
Rozsah:Uplatňuje se jen při hledání adresy LPT portu.
hodnota je 0 nebo 1. Nastavujte vždy hodnotu 0.

Funkce vrátí hodnotu požadovaného portu. Nebo hodnotu -1 pokud port NENALEZEN.

Při dotazu na paralelní port (LPT1, LPT2, LPT3 a LPT4) máte možnost pracovat z funkcemi:

Místo toho, abyste používali například: Zapis($378,100) : Zapíše na LPT port hodnotu 100. Poznámka: Hodnota $378 je základní adresa LPT portu, nastavena v BOISu. Otevřete, dáte dotaz na LPT port, komunikační port pomocí funkce OpenPort z knihovny KNIHOVNA.DLL. Z návratové adresy zjistíte, zda port existuje, pokud vrácená hodnota není -1, tak paralelní port je k dispozici a můžete pracovat s funkcemi:

Např. Zapis_Data (100). Zapíše hodnotu 100 do registru paralelního portu Data LPT. Pokud dáte dotaz na Adresu COM1 portu (předtím jste se dotazoval na LPT1 port), i nadále pracujete s portem LPT1. Pokud ale dáte dotaz na LPT2, tak už pracujete s portem LPT2. To za předpokladu že funkce OpenPort nevrátí hodnotu -1. Pokud se vrátí hodnota -1, tak i nadále pracujete s portem LPT1. Celé kouzlo je že nepotřebujete znát adresu požadovaného LPT, to si dokáže knihovny zjistit samy. Pouze jednou si otevřete paralelní port a posíláte/čtete data z požadovaných registrů LPT.

Způsob deklarace knihovny KNIHOVNA.DLL ve Visual Basic:

vb.net code
Private Declare Function OpenPort Lib "knihovna.dll" _
(ByVal Port As String, ByVal Rozsah As Integer) As Integer 'Otevre a dotaz na Port.
Private Declare Function UnLock_ Lib "knihovna.dll" () As Integer 'Otevre *.sys ovladac.
Private Declare Function Lock_ Lib "knihovna.dll" () As Integer 'Zavre *.sys ovladac.
Private Declare Function Dll_Register_Server Lib "knihovna.dll" (ByVal Reg As String) As Integer
Private Declare Function Dll_UnRegister_Server Lib "knihovna.dll" (ByVal Reg As String) As Integer
Private Declare Function Zapis Lib "knihovna.dll" (ByVal Port As Integer, ByVal Data As Byte) As Integer
Private Declare Function Zapis_Data Lib "knihovna.dll" (ByVal Data As Byte) As Integer
Private Declare Function Zapis_Status Lib "knihovna.dll" (ByVal Data As Byte) As Integer
Private Declare Function Zapis_Control Lib "knihovna.dll" (ByVal Data As Byte) As Integer
Private Declare Function Cteni Lib "knihovna.dll" (ByVal Port As Integer) As Integer
Private Declare Function Cteni_Data Lib "knihovna.dll" () As Integer
Private Declare Function Cteni_Status Lib "knihovna.dll" () As Integer
Private Declare Function Cteni_Control Lib "knihovna.dll" () As Integer
Private Declare Function Error Lib "knihovna.dll" () As Integer
Private Declare Function chyba Lib "knihovna.dll" (ByVal text As String) As Integer
Private Declare Function Cekat Lib "knihovna.dll" (ByVal delka As Integer) As Integer
Private Declare Function GET_DMA_PORT Lib "knihovna.dll" () As Integer
Private Declare Function GET_IRQ_PORT Lib "knihovna.dll" () As Integer
Private Declare Function GET_TYPE_PORT Lib "knihovna.dll" () As Integer

Způsob ovládání LPT portu ve Visual Basic s formulářem:

vb.net code
Private Sub Form_Load()
Dim AdresaPortu As Integer
Dim rnt As Integer
 
Let Rozsah = 0
Let NazevPortu = "LPT1"
 
Let rnt = UnLock_()
If (rnt = 0 Or rnt = 183 Or rnt = 1073 Or rnt = 1056) Then
  AdresaPortu = OpenPort(NazevPortu, Rozsah)
  If (Error() = 0) Then
 
    ...
    inicializece HW
    ...
 
  Else: Rem Zpracovani chyby
  End If
Else: Rem Zpracovani chyby
End If
End Sub




Způsob deklarace knihovny KNIHOVNA.DLL ve Visual C:

C++ code
//************************************************************
__declspec(dllimport) int WINAPI Dll_Register_Server(LPSTR Knihovna);
__declspec(dllimport) int WINAPI Dll_UnRegister_Server(LPSTR Knihovna);
__declspec(dllimport) int WINAPI UnLock_(void);
__declspec(dllimport) int WINAPI Lock_(void);
__declspec(dllimport) int WINAPI OpenPort(LPSTR Port, int Rozsah);
__declspec(dllimport) int WINAPI Zapis_Data(byte hodnota);
__declspec(dllimport) int WINAPI Zapis_Control(byte hodnota);
__declspec(dllimport) int WINAPI Zapis_Status(byte hodnota);
__declspec(dllimport) int WINAPI Zapis(int AdresaPortu, byte hodnota);
__declspec(dllimport) int WINAPI Cteni_Data(void);
__declspec(dllimport) int WINAPI Cteni_Control(void);
__declspec(dllimport) int WINAPI Cteni_Status(void);
__declspec(dllimport) int WINAPI Cteni(int AdresaPortu);
__declspec(dllimport) int WINAPI Cekat(unsigned int delka);
__declspec(dllimport) int WINAPI CekatEx(unsigned int delka);
__declspec(dllimport) int WINAPI Error(void);
__declspec(dllimport) int WINAPI GET_DMA_PORT(void);
__declspec(dllimport) int WINAPI GET_IRQ_PORT(void);
__declspec(dllimport) int WINAPI GET_TYPE_PORT(void);
__declspec(dllimport) void WINAPI chyba(LPSTR text);
//************************************************************

Způsob deklarace knihovny KNIHOVNA.DLL ve Visual C++:

C++ code
//************************************************************
extern "C"
{
__declspec(dllimport) int WINAPI Dll_Register_Server(LPSTR Knihovna);
__declspec(dllimport) int WINAPI Dll_UnRegister_Server(LPSTR Knihovna);
__declspec(dllimport) int WINAPI UnLock_(void);
__declspec(dllimport) int WINAPI Lock_(void);
__declspec(dllimport) int WINAPI OpenPort(LPSTR Port, int Rozsah);
__declspec(dllimport) int WINAPI Zapis_Data(byte hodnota);
__declspec(dllimport) int WINAPI Zapis_Control(byte hodnota);
__declspec(dllimport) int WINAPI Zapis_Status(byte hodnota);
__declspec(dllimport) int WINAPI Zapis(int AdresaPortu, byte hodnota);
__declspec(dllimport) int WINAPI Cteni_Data(void);
__declspec(dllimport) int WINAPI Cteni_Control(void);
__declspec(dllimport) int WINAPI Cteni_Status(void);
__declspec(dllimport) int WINAPI Cteni(int AdresaPortu);
__declspec(dllimport) int WINAPI Cekat(unsigned int delka);
__declspec(dllimport) int WINAPI CekatEx(unsigned int delka);
__declspec(dllimport) int WINAPI Error(void);
__declspec(dllimport) int WINAPI GET_DMA_PORT(void);
__declspec(dllimport) int WINAPI GET_IRQ_PORT(void);
__declspec(dllimport) int WINAPI GET_TYPE_PORT(void);
__declspec(dllimport) void WINAPI chyba(LPSTR text);
}
//************************************************************

Způsob ovládání LPT portu v céčku:

C++ code
...
UnLock_();
if(Error() == 0 && 183 && 1073 && 1056){
   AdresaPortu = OpenPort("LPT1", 0);
   if(Error() == 0){
      ...
      Zapis(AdresaPortu + 0,hodnota); //Data
      Zapis(AdresaPortu + 1,hodnota); //Status
      Zapis(AdresaPortu + 2,hodnota); //Control
      hodnota = Cteni(AdresaPortu + 0); //Data
      hodnota = Cteni(AdresaPortu + 1); //Status
      hodnota = Cteni(AdresaPortu + 2); //Control
      ...
   }
}
else{
   ...
   Zpracovaní chyby
   ...
}
Lock_();
...

Nebo, nejpohodlnější způsob práce s LPT porty.

C++ code
int AdresaPortu = 0;
byte LPT_Registr_Data;
byte LPT_Registr_Control;
byte LPT_Registr_Status;
...
UnLock_(); //
if(Error() == 0 && 183 && 1073 && 1056)){
   AdresaPortu = OpenPort("LPT1", 0);
   if(Error() == 0){
      ...
      Zapis_Data(hodnota);
      Zapis_Control(hodnota);
      Zapis_Status(hodnota);
      LPT_Registr_Data = Cteni_Data();
      LPT_Registr_Control = Cteni_Control();
      LPT_Registr_Status = Cteni_Status();
      ..
   }
}
else{
   ...
   Zpracovaní chyby
   ...
}
Lock_();
...

Dále je třeba k projektu v C nebo C++ přilinkovat tato knihovna.lib soubor.

V archívu: AdresaPortu.zip je Knihovna AdresaPortu.dll s projektem napsaným ve Visual Basic 6 který ukazuje použiti této knihovny.

V archívu: OvladacPortu.zip je Knihovna.dll a AdresaPortu.dll s projektem napsaným ve Visual Basic 6 který ukazuje použiti těchto knihoven.

V době vzniku konstrukcí jsem paralelně pracoval i na AdresaPortu.dll a Knihovna.dll a tak můžete prostudovat jejích použití v různých konstrukcích na tomto webu. Verze knihoven AdresaPortu.dll a Knihovna.dll jsou takové, které jsem měl v té době k dispozici. Pouze na této stránce jsou zmiňované knihovny nejaktuálnější.

V konstrukci Lcd ovladac201.zip ( Komplexní řešení připojení LCD zobrazovače s radičem HD44780 k LPT portu ) můžete prostudovat způsob použití knihovny: Knihovna.DLL, nebo Programátor pamětí EEPROM 93LC56, případně Monitorování paralelního portu pod systémy Win2000 a WinXP. a nebo jakýkoliv jiný program z tohoto webu.

Ujednání:
Tento archív můžete neomezeně šířit pouze kompletní!
Tento archív se nesmí za úplatu kopírovat a šířit.
Nesmí být použit v KOMERČNÍCH projektech bez souhlasu autora.
Pokud používáte tyto knihovny ve svém programu, už nemusíte přikládat kompletní archív ani dokumentaci. Postačí, ze uvedete zdroj a odkaz na server www.prochazka.zde.cz těchto knihoven v dokumentaci o vašem programu nebo aboutu (O Aplikaci ...).

Děkuji, že používáte tyto produkty.

Autor ovladaču Giveio.SYS je:
Dale Roberts, Direct I/O and Windows NT
ftp://ftp.mfi.com/pub/windev/1995/may95.zip.