Doriți să știți cum să gestionați un port în Windows

Acum, să examinăm modul în care acest driver poate fi aplicat în practică. Mai întâi, descărcați arhiva cu driverul și o bibliotecă de funcții pentru a lucra cu aceasta.

Acolo vă veți găsi de fapt driverul xDRV.sys, xDRV.dll bibliotecă partajată, bibliotecă statică xDRV.lib, care poate fi necesară atunci când compilarea aplicației cu o conexiune dll statică și fișierul antet cu descrierea funcțiilor care pot fi controlate cu ajutorul conducătorului auto. Luați în considerare aceste funcții:







Cu ++: bool xDRV_OpenDriver ();
Delphi: funcția xDRV_OpenDriver (): Boolean;
Driverul xDRV.sys este încărcat dinamic. Această funcție este utilizată pentru încărcare și inițializare. Dacă driverul este încărcat cu succes, acesta va reveni la adevărat, altfel este fals. Acesta trebuie să fie numit o dată la începutul cererii. Dacă se întoarce false, încercați să reporniți computerul. Poate că xDRV.sys a fost deja încărcat în memorie și funcția xDRV_StopDriver () nu a fost utilizată pentru stoparea corectă. Driverul și biblioteca trebuie să fie în același director ca și executabilul.

Cu ++: void xDRV_StopDriver ();
Delphi: procedura xDRV_StopDriver ();
Ciudat cum pare, această funcție este destul de importantă. Acesta trebuie să fie numit la sfârșitul cererii. Dacă acest lucru nu se face, șoferul va rămâne în memorie și va intercepta întreruperile. Mai rău, dacă încercați să îl descărcați din nou, poate apărea o eroare.

Cu ++: void xDRV_Write (portAdr scurt nesemnat, char charted nesigned PortValue);
Delphi: procedura xDRV_Write (PortAdr: LongInt; PortValue: Byte);
Această funcție vă permite să scrieți un octet de date (PortValue) la un port (PortAdr). De exemplu, pentru a seta portul DATE LPT pe un singur port, trebuie să îl apelați cu următorii parametri: xDRV_Write (0x378, 255)

C ++: nesemnate char xDRV_Read (portAdr scurt);
Delphi: funcția xDRV_Read (PortAdr: LongInt): Byte;
Scopul acestei funcții, cred, este complet de înțeles. Acesta va citi și va returna valoarea din port (PortAdr).






void Nume_funcțional (void * variableName);

Pentru a explica în cele din urmă principiile de lucru cu xDRV.sys, vă aduc în atenție trei proiecte gata făcute de aplicații de testare cu cod sursă care utilizează toate funcțiile acestui driver. Două dintre ele sunt scrise în C și \ C ++ într-un mediu Microsoft Visual C ++ 6.0. Prima dintre variantele WinAPI, cea de-a doua este MFC. În final, am adăugat un proiect de testare în Delphi (mediul de dezvoltare: Borland Delphi 7). Este recomandabil să nu rulați aplicațiile până când nu vă familiarizați cu acest articol până la sfârșit.

Hardware (hardware)

Acum să ne ocupăm de hardware. Iată câteva caracteristici spetseficheskie, fără de care nici o întrerupere regestrirovat udastsya.Zaydete Start -> Settings -> Control Panel -> System -> Hardware -> Device Manager -> Porturi (COM & LPT) -> Imprimanta Port (LPT1) -> proprietăți. În fila "Setări port", trebuie setat butonul "Utilizați orice întrerupere atribuită portului".

Apoi, luați conectorul portului LPT testat și asigurați-vă! setați contactul de 15 (bitul 3 al registrului STATUS-ERROR) la zero, conectându-l la oricare dintre terminalele de la sol ale portului (18-25). Motivul pentru această mișcare va fi explicat mai jos.

Acum explicația promisă despre linia ERROR. Dacă nu am pus această linie la zero, atunci programul ar putea procesa o singură întrerupere. Încercările repetate de a trage linia ACK nu vor duce la nimic. In acelasi timp, inregistrarile DATA si CONTROL vor incepe sa se incarce haotice, ceea ce va dura aproximativ un minut. Motivul pentru toate acestea este driverul nativ al portului, care face parte din sistemul de operare. El precum și xDRV.sys primește o întrerupere de semnal și fără a plăti nici o atenție la al doilea strangularea fratele său de arama - xDRV.sys (în zona de procesare de întrerupere). Clipirea în port este driverul sistemului de operare încercând să ajungă la "imprimanta", pe care crede că este conectată la port și a trimis un semnal de întrerupere. pentru că nu există nici o imprimantă, atunci totul este inutil și după aproximativ un minut conducătorul auto nativ ia o decizie că imprimanta este "moartă" și nu mai acordă nici o atenție la ea. Deci, acum dacă închideți aplicația (asigurați-vă că pentru a aplica o funcție xDRV_StopDriver ()) și începe din nou, nici o problema nu va fi posibil pentru a captura toate întreruperile - Microsoft # 96ovsky conducător auto nu va interfera.

Dar, în scopul de a nu așteptați un minut și nu reporniți aplicația, trebuie să stabilească imediat o linie de eroare la zero - aceasta ar însemna că noastre „pseudo-imprimantă“ este defect și nu este necesar să se acorde o atenție la întreruperile sale. Driverul nativ face acest lucru (spre deosebire de xDRV.sys) și nu mai ajunge în xDRV.sys.

Desigur, vom pierde o linie pentru controlul și transferul de date, dar cred că această pierdere este compensată de capacitatea de a gestiona întreruperile.







Articole similare

Trimiteți-le prietenilor: