AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Ansteuern des Parallelports
Tutorial durchsuchen
Ansicht
Themen-Optionen

Ansteuern des Parallelports

Ein Tutorial von flomei · begonnen am 25. Mai 2003 · letzter Beitrag vom 8. Okt 2006
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Benutzerbild von flomei
flomei
Registriert seit: 17. Jan 2003
Hallo liebe DP-User!

Immer wieder wird gefragt, wie man den Parallelport ansteuern kann. Also dachte ich mir: Fängste mal an und schreibst ein Tutorial. Ich hoffe, dass wird mir gelingen.
Ich werd gleich erstmal mit nem bisschen Theorie anfangen. Zum Aufwärmen!

Also: Ab geht´s!


MfG Florian



P.S.: Ich werde gelegentlich aus einer meiner Technik-Arbeiten zitieren.

[EDIT] Ich übernehme keinerlei Garantie für die Richtigkeit der von mir gemachten Angaben. Große Teile des Codes stammen aus dem I-Net und aus diesem Forum. Ich danke allen, die durch ihre Beiträge geholfen haben dieses Tutorial zu vervollständigen! [/EDIT]
... ist raus.
Vielen Dank für die Zeit mit euch!
http://www.flomei.de -- http://www.md5hash.de
 
Benutzerbild von flomei
flomei

 
Delphi 2005 Personal
 
#2
  Alt 25. Mai 2003, 20:09
Es wäre sicherlich zu kompliziert und zu ausführlich alle möglichen Fragen zu beantworten, aber einige (mir wichtig erscheinende) Fragen möchte ich dennoch beantworten.
  • Parallelport? Heisst der nicht auch LPT? Was bedeutet das?
    LPT bedeutet "Line Printer"
    Der Parallelport wird auch Parallele Schnittstelle genannt. Warum? Dazu komme ich noch!

    Aus meiner Technik-Arbeit:
    Zitat:
    Der Standard dieser Schnittstelle ist IEEE1284. Die Schnittstelle heißt EPP Enhanced Parallel Port oder ECP Enhanced Capabilities Port oder einfach LPT.
  • Parallelport? Wofür?
    Tja, ganz einfach! Zum Ansteuern aller möglichen (und unmöglichen ) Sachen. Zum Beispiel: Drucker, ZIP-Laufwerke, Scanner, usw.
    Wer Fantasie hat und handwerklich/technisch ein wenig geschickt ist kann alles mögliche per Parallelport steuern!
  • Hört sich ja gut an! Wie geht das?
    Eigentlich auch ganz einfach! Die Daten werden über 8 Datenleitungen geschickt. Weiterhin gibt es 8 Statusleitungen. Diese melden zum Beispiel, wenn das Papier leer ist oder wenn der Drucker Daten empfängt.
  • 8 Datenleitungen? Das ist ganz schön schnell, oder?
    Das stimmt! Das funktioniert wie folgt: Über die 8 Datenleitungen werden parallel (daher der Name) Daten gesendet. 8 x 1 Bit macht 1 Byte. D.h.: Pro "Signal" wird ein Byte Daten übertragen.
  • Aha! Wie sehen diese Schnittstellen denn aus und wo finde ich Sie?
    Die Stecker wurden von vielen großen Firmen entwickelt und später auch "Centronics" genannt. Unter diesen Firmen waren auch IBM und Microsoft. Centronics Schnittstellen findet man an (fast) allen PC´s. Während ältere PC´s noch Controller brauchten sind sie heute On-Board. Heutzutage wird der Parallelport allerdings immer unwichtiger, da USB durch Plug&Play flexibler und vielseitiger ist. Es gibt Centronics Stecker in mehreren Ausführungen.

    Hier hab ich mal nen paar Zeichnungen von Centronics Steckern.

    Das ist der Druckeranschluss.


    Das ist der PC-Anschluß.


Ich hoffe, dass ich jetzt die allerwichtigsten Fragen geklärt habe. Wenn jemand weitere Fragen hat, kann er diese ja per PN an mich richten, ich werde sie dann hier aufnehmen!

MfG Florian

P.S.: Warum die vielen Edits? Sch*** Bilder!

[edit=Admin]Bilder eingebettet und als Attachments entfernt. Mfg, Daniel[/edit]
Florian Meier
  Mit Zitat antworten Zitat
Benutzerbild von flomei
flomei

 
Delphi 2005 Personal
 
#3
  Alt 10. Jul 2003, 21:09
Vielen Dank Daniel!

Hallo nochmal!

Da nun soviele Leute hier gefragt haben will ich doch schnell noch einen Teil machen...

Achtung! Dieser Code funktioniert nur unter Win9x und ME!

Man kann den Parallelport auf Win9x und ME Systemen leicht über eine kleine Prozedur ansprechen...

Delphi-Quellcode:
procedure PortOut(x:byte);
 begin
  asm //erklärt dem Compiler, dass Assembler Code anfängt
   mov dx,378h //378h ist die Adresse von LPT 1
   mov al,x //x müssen wir noch einen Wert zuweisen
   out dx,al
  end;
 end;
Schreibt diese Prozedur in euren Quelltext.
Dann könnt Ihr sie leicht aufrufen.
Bsp.:
Delphi-Quellcode:
procedure TEureForm.ZBButtonClick(Sender: TObject); assembler;
 begin
  port(1); //hier weisen wir x einen Wert zu (siehe Tabelle unten)
 end;
In diesem Beispiel setzen wir Datenpin 0 (den ersten Pin am Stecker) auf High.



Wir können erkennen, dass jeder Pin einen eigenen Wert hat. Setzen wir x nun auf diesen Wert werden die entsprechenden Pins High gesetzt. Damit kann man lustig herum experimentieren und allerlei "Zeugs" ansteuern und was sonst noch alles.

Kommen wir zum Einlesen...

Folgender Code stammt von Michael *-=[ Mika ]=-* Wendeln. Er hat mir beim Einlesen geholfen. Er wurde von ihm kommentiert und ich modifizierte ihn meinen Ansprüchen entsprechend.

Original Code:
Delphi-Quellcode:
//Nochmals tausend Dank an *-=[ Mika ]=-*
Function LesePort( Port : Word ) : Byte;
Const
  LPT_DataRegister = $378;
  LPT_StatusRegister = $379;
  LPT_KontrollRegister = $37A;

Var
  Value: Byte;
  Port: Word;

Begin
  // Welches Register des Statusports willst du lesen?
  Port := LPT_DataRegister

  // Werte holen aus dem Register des Ports (NUR UNTER WINDOWS 9X)
  asm
    mov dx, Port
    in al, dx
    Mov Value, AL
  end;

  // Nachsehen was gesetzt war
  case Port of
    LPT_DataRegister : Begin
                             IF Value AND $01 = $01 then ShowMessage('Pin 1 ist gesetzt: Databit 0');
                             IF Value AND $02 = $02 then ShowMessage('Pin 2 ist gesetzt: Databit 1');
                             IF Value AND $04 = $04 then ShowMessage('Pin 3 ist gesetzt: Databit 2');
                             IF Value AND $08 = $08 then ShowMessage('Pin 4 ist gesetzt: Databit 3');
                             IF Value AND $16 = $16 then ShowMessage('Pin 5 ist gesetzt: Databit 4');
                             IF Value AND $32 = $32 then ShowMessage('Pin 6 ist gesetzt: Databit 5');
                             IF Value AND $64 = $64 then ShowMessage('Pin 7 ist gesetzt: Databit 6');
                             IF Value AND $128 = $128 then ShowMessage('Pin 8 ist gesetzt: Databit 7');
                           End;
    LPT_StatusRegister : Begin
                             IF Value AND $08 = $08 then ShowMessage('Pin 4 ist gesetzt: ERROR');
                             IF Value AND $16 = $16 then ShowMessage('Pin 5 ist gesetzt: SELECT');
                             IF Value AND $32 = $32 then ShowMessage('Pin 6 ist gesetzt: PAPER OUT');
                             IF Value AND $64 = $64 then ShowMessage('Pin 7 ist gesetzt: ACK');
                             IF Value AND $128 = $0 then ShowMessage('Pin 8 ist gesetzt: BUSY (INVERTIERT)');
                           End;
    LPT_KontrollRegister : Begin
                             IF Value AND $01 = $00 then ShowMessage('Pin 1 ist gesetzt: STROBE (INVERTIERT)');
                             IF Value AND $02 = $02 then ShowMessage('Pin 2 ist gesetzt: AUTO FEED');
                             IF Value AND $04 = $00 then ShowMessage('Pin 3 ist gesetzt: INIT (INVERTIERT)');
                             IF Value AND $08 = $00 then ShowMessage('Pin 4 ist gesetzt: SELECT IN (INVERTIERT)');
                           End;
  end;
end;
Diesen Code kann man seinen Wünschen entsprechend anpassen (mehr oder weniger Ports abfragen usw.).
Am Besten ist man probiert einfach ein bisschen rum. Je nachdem was man machen will muss man vielleicht auch gar nichts einlesen sondern nur ausgeben... Ihr seht: Eurer Fantasie sind keine Grenzen gesetzt!

Nun ja... als nächstes müsste ich mit Win2k / NT / XP weiter machen. Wie mir von *-=[ Mika ]=-* berichtet wurde muss man lediglich einen Treiber einbinden damit der obrige Code auch dort funktioniert.
Ich möchte mich dafür entschuldigen, dass ich diesen Teil nur so hingepfuscht habe aber ich habe wirklich sehr wenig (ja ich wiederhole mich ) Zeit. Der gepostete Code funktioniert bei mir tadellos und sollte so auch auf jedem anderen Win9x oder ME System laufen. So bald ich mich über das Einbinden der Treiber und deren Umgang schlau gemacht habe werde ich fortfahren.
Ich hoffe jedoch, dass ich wenigstens einigen wieder ein wenig helfen konnte.

MfG der gestresste Florian

[edit=Admin]Bild eingebettet und als Attachment entfernt. Mfg, Daniel[/edit]
Florian Meier
  Mit Zitat antworten Zitat
Florian H

 
Delphi 6 Professional
 
#4
  Alt 11. Jul 2003, 05:56
Wow, super! Danke schonmal
wir armen XP-User warten dann mal geduldig
Florian Heft
  Mit Zitat antworten Zitat
Gast
 
#5
  Alt 11. Jul 2003, 08:16
Arme XP (i.e. NT-Plattform) Benutzer sollten sich mal mit der CreateFile() API und DeviceIoControl() auseinandersetzen. Natürlich geht das nur in einem bestimmten Kontext (zB Admin). Es handelt sich eben um ein System mit Sicherheitsmechanismen.
\??\LPT1 zeigt auf meinem System beispielsweise auf \Device\NamedPipe\Spooler\LPT1 ... ansonsten unter \Device\Parallel*
Wobei * ein generischer Platzhalter ist.

Obiges Beispiel geht zwar, aber nur von einem Treiber aus.
Aber wer weiß schon, ob die Geräte nun wirklich an diesem Port hängen, der dort hardcoded wurde?
  Mit Zitat antworten Zitat
pmc

 
Delphi 6 Personal
 
#6
  Alt 11. Sep 2003, 15:13
Für Alle XP und 2k user -> schaut mal HIER....
  Mit Zitat antworten Zitat
Virus3.1

 
Delphi 7 Professional
 
#7
  Alt 9. Okt 2003, 14:10
Warum denn immer alles über Delphi ansprechen wollen. Wenn man auf das gute allte Turbo Pascal zurückgreift kann man mit den oben genannten Assembler Zeilen (In Turbo Pascal genauso einzubinden wie in Delphi über asm...end) den Com1, Com2, LPT Anschluss ansprechen, da das Projekt dann in DOS gestartet wird und man über Dos auch in Win XP auf die Ports zugreifen kann.

by Virus3.1

P.S.: Hab's nur unter Win XP getestet, dürfte aber auch unter Win 2k laufen.
  Mit Zitat antworten Zitat
Benutzerbild von flomei
flomei

 
Delphi 2005 Personal
 
#8
  Alt 9. Okt 2003, 14:16
Zitat von Virus3.1:
Warum denn immer alles über Delphi ansprechen wollen.
Warum? Weil das hier ein Delphi-Forum ist!!! Deshalb! Ausserdem glaube ich, dass man mit Delphi bessere GUI´s für solche Aufgaben erstellen kann als mit TP. Aber wenn du das besser weisst... mach das ruhig mit TP. Das ist sowieso die Zukunft...

MfG Florian
Florian Meier
  Mit Zitat antworten Zitat
Delphianer

 
Delphi 10.2 Tokyo Enterprise
 
#9
  Alt 10. Okt 2003, 14:09
Sorry,

aber der (alte) Anschluß am PC ist eine 25polige Sub-D-Buchse. Und die original Centronics-Schnittstelle ist leider auch nicht die schnellste:

"Der Compatiblity Mode (auch "Centronics Mode") kann nur Daten senden, typischerweise mit 50 KB/s, in Ausnahmefällen auch mit mehr als 150 KB/s. Um Daten zu empfangen muss der Controller auf Nibble oder Byte Mode umstellen. Im Nibble Mode werden dabei 4 Bit Pakete
empfangen ("Nibbles"), während im Byte Mode die Bi-Direktionalität zum Zuge kommt und die Daten byte-weise (8 Bit) übertragen werden. Die bi-direktional fähigen Parallel-Ports bezeichnet man als SPP (Standard Parallel Port)."

von
http://www.faqs.org/faqs/de/comp/har...l_5/index.html

Grüße
Lutz
  Mit Zitat antworten Zitat
Benutzerbild von flomei
flomei

 
Delphi 2005 Personal
 
#10
  Alt 10. Okt 2003, 14:17
hm...
Die meisten Computer haben SPP. Ich habe noch keinen gesehen bei dem dies nicht so ist...

MfG Florian
Florian Meier
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 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