Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   LPT-Port ansteuern [NT!]. Infos und/oder Tester gesucht. (https://www.delphipraxis.net/45104-lpt-port-ansteuern-%5Bnt-%5D-infos-und-oder-tester-gesucht.html)

Mephistopheles 29. Apr 2005 18:12


LPT-Port ansteuern [NT!]. Infos und/oder Tester gesucht.
 
Hallo,

nachdem ich mich heute dafür rechtfertigen mußte, daß ich von generischen Porttreibern abrate, wird mir die Sache zu bunt. Ich habe eingesehen, daß, solange ich keine "mundgerechte" Lösung vorsetze, wieder und wieder unsichere generische Porttreiber benutzt werden!

Ich würde gern diesen Thread nutzen, um eine Lösung ohne zusätzlichen Treiber, zu entwickeln. Das Prinzip ist mir klar (ich meine zu wissen, wie es geht), allein mir fehlt Hardware, an welcher ich es testen könnte. Wenn mir also jemand a.) entweder Informationen geben kann, welches Parallelportgerät sich eignen würde (vorzugsweise eine billige Lösung!) oder b.) sich und zwangsläufig seinen Rechner als Testplattform zur Verfügung stellen würde, wäre mir sehr geholfen.

(Zu a.: natürlich brauche ich entsprechend auch die Dokumentation, welche Eingabewerte welche Ausgabe ergeben usw. usf.)

Voraussetzung ist ganz offensichtlich die Verwendung eines NT-Betriebssystems (NT4, W2K, WXP, W2K3) sowie viel Geduld, da ich mich nicht primär mit diesem Problem befassen werde. Vorschläge bitte hier. Tests werden über Email-Attachments abgewickelt.

Das Resultat landet u.a. in der Codelib! MPL ist VB für die zu benutzende Lizenz (vorausgesetzt jemand findet sich hier und arbeitet auch am Code mit, ansonsten bestimme ich die Lizenz natürlich allein).

Das Engagement der Tester wird natürlich in der Unit (oder was immer rauskommt) gewürdigt werden.

Danke für aufmerksames Lesen,

DGL-luke 29. Apr 2005 18:31

Re: LPT-Port ansteuern [NT!]. Infos und/oder Tester gesucht.
 
hast du ein multimeter? wenn nicht, stelle ich mich dafür zur verfügung, meins in die ports reinzuhalten. um so sachen wie "alle ports high" zu überprüfen.

Mephistopheles 29. Apr 2005 18:34

Re: LPT-Port ansteuern [NT!]. Infos und/oder Tester gesucht.
 
Nope, habe kein Multimeter. In diesem Fall muß ich wohl etwas umdisponieren und dir ein kleines Tool schreiben, mit dem du variabel Bytes, Words und DWORDs and den LPT senden kannst. Sollte aber machbar sein. Danke erstmal für's Angebot. Kannst du mir deine Emailadresse mal per PN zukommen lassen?

dragi 29. Apr 2005 19:21

Re: LPT-Port ansteuern [NT!]. Infos und/oder Tester gesucht.
 
Hallo,

ich habe ein LCD an meinem LPT Port angschlossen. Und wenn das was nützt dann stehe ich zu Verfügung. Und nen Multimeter kann ich auch dranhalten...man muss mir nur sagen was ich dann einstellen soll und was es anzeigen sollte! Hab da nicht so die Ahnung von.
Aber ich möchte helfen wo es geht...ich suche auch einen Weg ohne diese Treiber auszukommen!

Gruss

Dragi

Mephistopheles 29. Apr 2005 20:45

Re: LPT-Port ansteuern [NT!]. Infos und/oder Tester gesucht.
 
Schick mal bitte auch eine kurze PN mit Mailadresse.

Das LCD gefällt mir als Testobjekt fast schon besser. Bitte schicke mit in der PN auch gleich mit, wo ich die Doku finde, oder schicke sie mir per Email, sobald du meine Adresse hast.

Aber nochmal: Geduld, dieses Projekt läuft auf Sparflamme. Wenn die Programmierer es nach 9 Jahren (seit NT4) nicht hinbekommen haben den LPT über den Standard-LPT-Treiber anzusprechen, kommt es auf ein paar Wochen auch nicht mehr an ;)

Mephistopheles 30. Apr 2005 09:59

Re: LPT-Port ansteuern [NT!]. Infos und/oder Tester gesucht.
 
Aufruf an alle Leser

Bitte laßt mir in diesem Thread oder per PM ein paar Codeschnipsel zukommen, die per IN/OUT den LPT ansteuern - aus DOS-Zeiten oder eben Windows 9x. Am interessantesten wäre Code, mit dem man einen DOS-fähigen (also Nicht-GDI) Drucker ansprechen kann - bei denen ist nämlich das Fabrikat egal.

Danke.

flomei 30. Apr 2005 10:03

Re: LPT-Port ansteuern [NT!]. Infos und/oder Tester gesucht.
 
In der Tutorial Sparte findest du nen kleines LPT Tutorial von mir.
Der Code dort sollte auf Win9x, ME und wahrscheinlich auch DOS laufen...

MFG Florian :hi:

omata 30. Apr 2005 16:07

Re: LPT-Port ansteuern [NT!]. Infos und/oder Tester gesucht.
 
Moin,

ich habe folgendes gefunden...
http://www.wideman-one.com/gw/tech/D...iopm/index.htm

in dem ZIP-Archiv auf der Seite...
http://www.wideman-one.com/gw/tech/D...opm/gwiopm.zip

ist alles vorhanden, was man so braucht (Treiber, Beispiel und sämtliche Quellcodes)

Der Treiber kann natürlich nicht unter einem eingeschränkten Benutzer gestartet werden. Hier wäre es wohl sinnvoll einen Registryeintrag zurealisieren, damit dies beim Start von XP als Admin passiert. Alternative wäre ein Programm, das dies übernimmt (dieser Teil kann dann aus dem Beispiel entnommen werden) und dieses müsste dann beim Booten gestartet werden. Wenn der Treiber geladen ist, kann diesen auch ein eingeschrängter Benutzer benutzen.

Vielleicht hilft das ja weiter.

[Nebenbemerkung]
Mir persönlich reicht dieses Ansteuern des Parallelport nicht. Ich finde diese gute alte Schnittstelle vorallem deshalb so interresant, weil man über sie einen Interrupt im System auslösen kann.
Dafür benötigt man aber einen anderen Treiber. Naja, wenn euch das Ansteuern der Pins reicht - hoffe mein Hinweis hilft euch weiter.
[/Nebenbemerkung]

MfG
Thorsten

Mephistopheles 30. Apr 2005 16:21

Re: LPT-Port ansteuern [NT!]. Infos und/oder Tester gesucht.
 
Zitat:

Zitat von omata
Der Treiber kann natürlich nicht unter einem eingeschränkten Benutzer gestartet werden. Hier wäre es wohl sinnvoll einen Registryeintrag zurealisieren, damit dies beim Start von XP als Admin passiert. Alternative wäre ein Programm, das dies übernimmt (dieser Teil kann dann aus dem Beispiel entnommen werden) und dieses müsste dann beim Booten gestartet werden. Wenn der Treiber geladen ist, kann diesen auch ein eingeschrängter Benutzer benutzen.

Geht leider nicht, daher bleibt nur die Alternative.

Zitat:

Zitat von omata
Mir persönlich reicht dieses Ansteuern des Parallelport nicht. Ich finde diese gute alte Schnittstelle vorallem deshalb so interresant, weil man über sie einen Interrupt im System auslösen kann.

Ich kenne das mit (Hardware)Interrupts exakt umgekehrt. Sie werden ausgelöst, nämlich durch Ereignisse an der Hardware. Klär mich mal auf. Worauf du hinauswillst.

Zitat:

Zitat von omata
Dafür benötigt man aber einen anderen Treiber. Naja, wenn euch das Ansteuern der Pins reicht - hoffe mein Hinweis hilft euch weiter.

Es geht mir hier darum, diese unsäglichen generischen Porttreiber endlich vom Tisch zu bekommen. Ich selber brauche das aktuell garnicht und habe es bisher nicht gebraucht.

engine 30. Apr 2005 18:22

Re: LPT-Port ansteuern [NT!]. Infos und/oder Tester gesucht.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Aufruf an alle Leser

Bitte laßt mir in diesem Thread oder per PM ein paar Codeschnipsel zukommen, die per IN/OUT den LPT ansteuern - aus DOS-Zeiten oder eben Windows 9x. Am interessantesten wäre Code, mit dem man einen DOS-fähigen (also Nicht-GDI) Drucker ansprechen kann - bei denen ist nämlich das Fabrikat egal.

Danke.
Hallo Mephistopheles,

vor längerer Zeit habe ich mal ein kleines Programm zum Ansteuern des LPT-Port in TP oder BP geschrieben. Bevor sich jetzt Alle über die schlechte Programmierung auslassen; ich würde das heute auch anders machen!
Ich bin mir nicht ganz sicher, ob Du so etwas gesucht hast. Dann habe ich noch ein Programm zum Auslesen eines D/A-Wandlers über den Com-Port. Für dieses Programm benötigt man definitiv einen Porttreiber.
Delphi-Quellcode:
{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * }
{ *                                                                         * }
{ *  Programm    : TestLPT                             Stand : 22.07.95  * }
{ *  Datei       : TestLPT.pas                                           * }
{ *                                                                         * }
{ *  Beschreibung : Testprogramm zum Ansteuern der Datenleitungen         * }
{ *                  am LPT-Port                                           * }
{ *                                                                         * }
{ *  Autor       : Ralf Appel                                            * }
{ *                                                                         * }
{ *                                                                         * }
{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * }



program TestLPT;

uses crt, dos, gra_tool, graph, Maus;

const
  KreisX : array[1..25] of integer = (400, 380, 360, 340, 320, 300, 280, 260,
                                      240, 220, 200, 180, 160, 390, 370, 350,
                                      330, 310, 290, 270, 250, 230, 210, 190,
                                      170);

  KreisY : array[1..25] of integer = (170, 170, 170, 170, 170, 170, 170, 170,
                                      170, 170, 170, 170, 170, 200, 200, 200,
                                      200, 200, 200, 200, 200, 200, 200, 200,
                                      200);

  Bit : array[1..8] of byte = (0, 0, 0, 0, 0, 0, 0, 0);
  SetBit : integer = 0;

  SchnittStelle : integer = 0;        { Als Schnittstelle wird LPT1 gesetzt }

var
  BitFeld, testBit, zaehler, code : integer;
  taste : char;

function ParalelReadReg(SchnittStelle : Integer) : integer;
var reg:Registers;

begin
  reg.ah:= 2;   { Status der Paralelen Schnittstelle abfragen - Funktion 02 }
  reg.dx:= SchnittStelle;             { Nummer der Schnittstelle - 0 = LPT1 }
  Intr($17,reg);                                 { Aufruf des Interrupt 17h }
  ParalelReadReg := reg.ah;                  { Rückgabe des Status als Byte }
end;

function ParalelWriteReg(SchnittStelle, SetBit : Integer) : integer;
var reg:Registers;

begin
  reg.ah:= 0;      { Daten zur Paralelen Schnittstelle Senden - Funktion 00 }
  reg.ah:= SetBit;          { Bit 0-7 an der Paralelen Schnittstelle setzen }
  reg.dx:= SchnittStelle;             { Nummer der Schnittstelle - 0 = LPT1 }
  Intr($17,reg);                                 { Aufruf des Interrupt 17h }
end;

procedure Zustand(Nummer, Farbe : integer);
begin
  if Farbe = blue then SetFillStyle(SolidFill, Blue)
                  else SetFillStyle(SolidFill, Green);
  FloodFill(KreisX[Nummer], KreisY[Nummer], black);
end;

procedure ZustandAusgang(Nummer, Farbe : integer);
begin
  if Farbe = magenta then SetFillStyle(SolidFill, magenta)
                     else SetFillStyle(SolidFill, yellow);
  FloodFill(KreisX[Nummer], KreisY[Nummer], black);
end;

begin
  clrscr;
  write('Wählen Sie 1 für LPT1 oder 2 für LPT2 : ');
  readln(taste);
  if taste = '1' then SchnittStelle := 0;
  if taste = '2' then SchnittStelle := 1;
  Grafik_ein(1);


  MausReg(1,2);
  SetColor(black);
  SetFillStyle(SolidFill, LightGray);
  bar(0, 0, GetMaxX, GetMaxY);
  for zaehler := 13 downto 1 do
  Circle(KreisX[zaehler], KreisY[1], 5);
  for zaehler := 25 downto 14 do
  Circle(KreisX[zaehler], KreisY[14], 5);
  Circle(150, 20, 5);
  OutTextXY(160,17,' = Masse');
  Circle(150, 40, 5);
  OutTextXY(160,37,' = Ausgang');
  Circle(150, 60, 5);
  OutTextXY(160,57,' = Eingang, nicht geschaltet');
  Circle(150, 80, 5);
  OutTextXY(160,77,' = Eingang, durch geschaltet');
  Circle(150, 100, 5);
  OutTextXY(160,97,' = Ausgang, nicht geschaltet');
  Circle(150, 120, 5);
  OutTextXY(160,117,' = Ausgang, durch geschaltet');

  if SchnittStelle = 0 then OutTextXY(210,182,'-Status von LPT1-')
                       else OutTextXY(210,182,'-Status von LPT2-');
  OutTextXY(397,150,'1');
  OutTextXY(377,150,'2');
  OutTextXY(357,150,'3');
  OutTextXY(337,150,'4');
  OutTextXY(317,150,'5');
  OutTextXY(297,150,'6');
  OutTextXY(277,150,'7');
  OutTextXY(257,150,'8');
  OutTextXY(237,150,'9');
  OutTextXY(212,150,'10');
  OutTextXY(192,150,'11');
  OutTextXY(172,150,'12');
  OutTextXY(152,150,'13');

  OutTextXY(385,220,'14');
  OutTextXY(365,220,'15');
  OutTextXY(345,220,'16');
  OutTextXY(325,220,'17');
  OutTextXY(305,220,'18');
  OutTextXY(285,220,'19');
  OutTextXY(265,220,'20');
  OutTextXY(245,220,'21');
  OutTextXY(225,220,'22');
  OutTextXY(205,220,'23');
  OutTextXY(185,220,'24');
  OutTextXY(165,220,'25');

  OutTextXY(20,GetMaxY - 100,'Tasten 2-9 schalten den Ausgang Ein/Aus.');
  OutTextXY(20,GetMaxY - 80,'Schalten Sie den Drucker ein.');
  OutTextXY(20,GetMaxY - 60,'Probieren Sie ON - OFF Line aus.');
  OutTextXY(20,GetMaxY - 40,'Entfernen Sie einmal das Papier aus dem Drucker.');
  OutTextXY(20,GetMaxY - 20,'ESC = Programm beenden...');
  MoveTo(140,160);
  LineRel(280,0);
  LineRel(-20,50);
  LineRel(-240,0);
  LineTo(140,160);
  SetFillStyle(SolidFill, brown);
  for zaehler := 25 downto 18 do
  FloodFill(KreisX[zaehler], KreisY[14], black);
  FloodFill(150, 20, black);
  SetFillStyle(SolidFill, yellow);
  FloodFill(150, 100, black);
  for zaehler := 9 downto 2 do
  FloodFill(KreisX[zaehler], KreisY[1], black);
  SetFillStyle(SolidFill, DarkGray);
  FloodFill(KreisX[14], KreisY[14], black);
  FloodFill(KreisX[16], KreisY[17], black);
  FloodFill(KreisX[17], KreisY[17], black);
  FloodFill(150, 40, black);
  SetFillStyle(SolidFill, Green);
  for zaehler := 13 downto 10 do
  FloodFill(KreisX[zaehler], KreisY[1], black);
  FloodFill(KreisX[15], KreisY[15], black);
  FloodFill(150, 60, black);
  SetFillStyle(SolidFill, blue);
  FloodFill(150, 80, black);
  SetFillStyle(SolidFill, magenta);
  FloodFill(150, 120, black);

  repeat
    if keypressed then
    begin
      taste := readkey;
      case taste of
        #50 : if Bit[1] = 0 then Bit[1] := 1
                            else Bit[1] := 0;
        #51 : if Bit[2] = 0 then Bit[2] := 1
                            else Bit[2] := 0;
        #52 : if Bit[3] = 0 then Bit[3] := 1
                            else Bit[3] := 0;
        #53 : if Bit[4] = 0 then Bit[4] := 1
                            else Bit[4] := 0;
        #54 : if Bit[5] = 0 then Bit[5] := 1
                            else Bit[5] := 0;
        #55 : if Bit[6] = 0 then Bit[6] := 1
                            else Bit[6] := 0;
        #56 : if Bit[7] = 0 then Bit[7] := 1
                            else Bit[7] := 0;
        #57 : if Bit[8] = 0 then Bit[8] := 1
                            else Bit[8] := 0;
      end;
      SetBit := (Bit[1] *1 + Bit[2] *2 + Bit[3] *4 + Bit[4] *8 + Bit[5] *16 +
                 Bit[6] *32 + Bit[7] *64 + Bit[8] *128);
      ParalelWriteReg(SchnittStelle, SetBit);
      for zaehler := 1 to 8 do
      begin
        if Bit[zaehler] = 1 then ZustandAusgang(zaehler+1, magenta)
                            else ZustandAusgang(zaehler+1, yellow);
      end;
    end;

    testBit := ParalelReadReg(SchnittStelle);
    BitFeld := testBit;
    if BitFeld and 8 <> 0 then Zustand(15, blue)
                           else Zustand(15, green);
    BitFeld := testBit;
    if BitFeld and 16 <> 0 then Zustand(13, blue)
                            else Zustand(13, green);
    BitFeld := testBit;
    if BitFeld and 32 <> 0 then Zustand(12, blue)
                            else Zustand(12, green);
    BitFeld := testBit;
    if BitFeld and 64 <> 0 then Zustand(10, blue)
                            else Zustand(10, green);
    BitFeld := testBit;
    if BitFeld and 128 <> 0 then Zustand(11, blue)
                             else Zustand(11, green);
  until taste in [#27,#13];
  Grafik_aus;
end.

omata 30. Apr 2005 18:48

Re: LPT-Port ansteuern [NT!]. Infos und/oder Tester gesucht.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,

Zitat:

Zitat von omata
Der Treiber kann natürlich nicht unter einem eingeschränkten Benutzer gestartet werden. Hier wäre es wohl sinnvoll einen Registryeintrag zurealisieren, damit dies beim Start von XP als Admin passiert. Alternative wäre ein Programm, das dies übernimmt (dieser Teil kann dann aus dem Beispiel entnommen werden) und dieses müsste dann beim Booten gestartet werden. Wenn der Treiber geladen ist, kann diesen auch ein eingeschrängter Benutzer benutzen.

Zitat:

Zitat von Mephistopheles
Geht leider nicht, daher bleibt nur die Alternative.

Die Alternative enhält das Beispiel schon. Dort kann man den Treiber laden (mit Adminrechten).
Die eigene Anwendung kann den Treiber dann benutzen (keine Adminrechte mehr notwenig.
Dies kann man gut testen, indem man das Beispiel zweimal öffnet, einmal mit Adminrechten und einmal ohne.

Zitat:

Zitat von omata
Mir persönlich reicht dieses Ansteuern des Parallelport nicht. Ich finde diese gute alte Schnittstelle vorallem deshalb so interresant, weil man über sie einen Interrupt im System auslösen kann.

Zitat:

Zitat von Mephistopheles
Ich kenne das mit (Hardware)Interrupts exakt umgekehrt. Sie werden ausgelöst, nämlich durch Ereignisse an der Hardware. Klär mich mal auf. Worauf du hinauswillst.

ja, so wie du es verstanden hast, habe ich es auch gemeint.
System stand hier für Betriebssystem. Über den Parallelport kann von einer Hardware ausserhalb des Rechners ein Interrupt im Rechner ausgelöst werden. Das war genau, was ich gemeint habe.
Sorry, wenn ich mich nicht klar ausgedrückt habe.

Zitat:

Zitat von omata
Dafür benötigt man aber einen anderen Treiber. Naja, wenn euch das Ansteuern der Pins reicht - hoffe mein Hinweis hilft euch weiter.

Zitat:

Zitat von Mephistopheles
Es geht mir hier darum, diese unsäglichen generischen Porttreiber endlich vom Tisch zu bekommen. Ich selber brauche das aktuell garnicht und habe es bisher nicht gebraucht.

ja, ich finde dein Vorhaben sehr gut.
Ich habe diese LPT-Port-Ansteuerthemen immer mit viel Interesse verfolgt.
Leider kommt oft der Spruch: Das ist ja alles nicht ok u.s.v aber nie kommt mal ein konkreter Vorschlag, wie es sinnvoll geht.
Das du das hier jetzt mal ändern willst, finde ich super.
Ich denke aber schon, das das Beispiel was ich hier erwähnt habe ganz informativ ist.
Sicher dort sind auch diese Direktzugriffe drin (auch) aber dort wird auch endlich mal die winsvc benutzt und speziell CreateService.

Oder wie willst du diese Portzugriff konkret realisieren? Welche Delphibefehle benutzen?

ich habe das Beispiel mal überarbeitet (goto raus, compiliert jetzt auch unter Delphi7 ohne Fehler/Warnung)

MfG
Thorsten

Mephistopheles 30. Apr 2005 19:08

Re: LPT-Port ansteuern [NT!]. Infos und/oder Tester gesucht.
 
@engine: Leider kann ich das nicht benutzen. Du hast damals offensichtlich schon die DOS-Funktionen benutzt (spezieller Int und vorher Register mit Funktionsindex und Parameter laden). Da du kein IN/OUT in deinem Beispiel nutzt, bringt es erstmal nix. Danke trotzdem für deine Mühe.

Zitat:

Zitat von omata
Zitat:

Zitat von omata
Mir persönlich reicht dieses Ansteuern des Parallelport nicht. Ich finde diese gute alte Schnittstelle vorallem deshalb so interresant, weil man über sie einen Interrupt im System auslösen kann.

Zitat:

Zitat von Mephistopheles
Ich kenne das mit (Hardware)Interrupts exakt umgekehrt. Sie werden ausgelöst, nämlich durch Ereignisse an der Hardware. Klär mich mal auf. Worauf du hinauswillst.

ja, so wie du es verstanden hast, habe ich es auch gemeint.
System stand hier für Betriebssystem. Über den Parallelport kann von einer Hardware ausserhalb des Rechners ein Interrupt im Rechner ausgelöst werden. Das war genau, was ich gemeint habe.
Sorry, wenn ich mich nicht klar ausgedrückt habe.

Okay. Dann ist klar, daß es einen eigenen Treiber braucht (Dongles z.B.).

Zitat:

Zitat von omata
Oder wie willst du diese Portzugriff konkret realisieren? Welche Delphibefehle benutzen?

API-Funktionen ;) ... DeviceIoControl oder die entsprechenden Native APIs. Muß ich noch sehen, wie es besser und schneller geht.
Genaugenommen ist es kein direkter Portzugriff, sondern Benutzung der Möglichkeiten, die schon vom Standard-LPT-Treiber seit mind. NT 3.51 zur Verfügung gestellt werden. Im Grunde machen das die DLLs der generischen Porttreiber auch nicht anders, obwohl es da auch diejenigen Treiber gibt, die direkt den Opcode für IN/OUT verwenden (schlecht!), was tabu ist - und jene die READ_PORT_*() benutzen (gut!). Um von der DLL oder einem Programm "direkt" auf einen Treiber zuzugreifen, braucht man sowieso IOCTLs, also DeviceIoControl() - oder eben Ersatzfunktionen.

Danke erstmal. Ich schaue mir das an ;)

engine 30. Apr 2005 21:41

Re: LPT-Port ansteuern [NT!]. Infos und/oder Tester gesucht.
 
Zitat:

Zitat von Mephistopheles
@engine: Leider kann ich das nicht benutzen. Du hast damals offensichtlich schon die DOS-Funktionen benutzt (spezieller Int und vorher Register mit Funktionsindex und Parameter laden). Da du kein IN/OUT in deinem Beispiel nutzt, bringt es erstmal nix. Danke trotzdem für deine Mühe.

Jetzt bin ich aber neugierig geworden. Das Beispiel bezieht sich auf die Serielle Schnittstelle. Mit TP und DOS konnte ich immer "PortW()" benutzen um auf den COM-Port zuzugreife. Unter Delphi funktionierte das natürlich nicht, da gab es PortW() ja nicht mehr und Windows verweigert ohne Porttreiber eh den Zugriff.
Meintest Du mit IN/OUT so etwas?

Delphi-Quellcode:
function PortIn(Addr : Word): Byte; Assembler; StdCall;
asm
  mov dx, Addr { Adresse in DX schreiben }
  in al, dx  { Port lesen. (AL entspricht Result) }
end;

procedure PortOut(Addr : Word; Data : Byte); Assembler; StdCAll;
asm
  mov dx, Addr { Adresse nach DX }
  mov al, Data { Datenbyte nach AL }
  out dx, al  { Port schreiben }
end;

function ReadMesskarte2(Kanal : byte) : double; (* $2FC = COM2; $3FC = COM1 *)
type
  KAN = array[1..12] of byte;
const
   DIN : array[1..8] of KAN = ((1,1,1,1,0,1,1,1,0,0,0,1), { 1 }
                               (1,1,1,1,0,1,1,1,0,0,1,1), { 2 }
                               (1,1,1,1,0,1,1,1,1,0,0,1), { 3 }
                               (1,1,1,1,0,1,1,1,1,0,1,1), { 4 }
                               (1,1,1,1,0,1,1,1,1,0,1,0), { 5 }
                               (1,1,1,1,0,1,1,1,0,1,1,1), { 6 }
                               (1,1,1,1,0,1,1,1,1,1,0,1), { 7 }
                               (1,1,1,1,0,1,1,1,1,1,1,1) { 8 }
                               );
   B   : integer = 2048;
   Ref : double = 5;
   Vout : double = 0;
var
  i : integer;
  d : byte;
begin
  Ref := 5;
  Vout := 0;
  B   := 2048;
  D   := 0;
  for i := 1 to 12 do
  begin
    PortOut($2FC ,($fe and PortIn($2FC)));
    if DIN[Kanal,13-i] = 0
    then PortOut($2FC ,($fd and PortIn($2FC)))
    else PortOut($2FC ,($2 or PortIn($2FC)));
    PortOut($2FC ,($1 or PortIn($2FC)));
    if (PortIn($2fe) and 16) = 16
    then D := 0
    else D := 1;
    Vout := Vout +(D*B);
    B := B div 2;
  end;
  ReadMesskarte2 := (Vout / 1023) *Ref /4;
  PortOut($2FC , ($fd and PortIn($2FC)));
  PortOut($2FC ,($2 or PortIn($2FC)));
end;

Mephistopheles 30. Apr 2005 22:10

Re: LPT-Port ansteuern [NT!]. Infos und/oder Tester gesucht.
 
Genau sowas meinte ich ;) ... aber eben als Beispiel für LPT, nicht COM :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz