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 3 von 4     123 4      
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
 
Capable
 
#21
  Alt 30. Jan 2005, 13:24
editiert
  Mit Zitat antworten Zitat
Muetze1
 
#22
  Alt 30. Jan 2005, 23:16
Moin!

Ein String (was in Edit1.Text steht) besteht aus einzelnen Zeichen - jedes Zeichen ist ein Byte.

Daher:

Delphi-Quellcode:
s := Edit1.Text;
For i := 1 To Length(s) Do
  DasByteDesItenZeichens := Ord( s[i] );
MfG
Muetze1
  Mit Zitat antworten Zitat
Capable
 
#23
  Alt 4. Feb 2005, 09:11
ok, schauen wir mal, ob ich das halbwegs verstanden habe:

>s := Edit1.Text;

der variable s (die ich mit string deklariere) wird der wert aus dem editfeld zugeordnet.

>Length(s)

gibt bei einstelligen s den wert 1 aus und bei zweistelligen den wert 2 usw.

>For i := 1 To Length(s)

mit i (ein integer) wird von 1 bis (bsp. einstelliges s) 1 gerechnet.

>DasByteDesItenZeichens

ist auch ein integer, dem...

>Ord( s[i] );

...und jetzt steig ich nicht mehr durch. welcher wert wird der variable zugeordnet. was ist eine ordinalzahl oder ordinale position?


sorry für meine unkenntnis
  Mit Zitat antworten Zitat
Muetze1
 
#24
  Alt 4. Feb 2005, 10:25
Moin!

s[i] ist das Zeichen der Zeichenkette an Position i.

Ein Zeichen ist aber ein anderer Typ als ein Byte - obwohl gleich gross und gleicher Inhalt, aber es ist ein anderer Typ. Ord() gibt dir somit den ASCII Wert des Zeichens zurück welches du übergibst - und genau dieses willst du doch auch ausgeben.

Length() - ermittelt die Länge des Strings - also Anzahl der Zeichen, ja

MfG
Muetze1
  Mit Zitat antworten Zitat
Capable
 
#25
  Alt 7. Feb 2005, 22:08
so, ich hab etwas rumprobiert, komm aber zu keinem ergebnis. könnt ihr mir sagen, wo der fehlerteufel steckt?

editiert es passiert schlichtweg gar nichts.
  Mit Zitat antworten Zitat
Muetze1
 
#26
  Alt 7. Feb 2005, 22:37
Moin!

Warum sollte auch?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Port:Word;
begin
  LesePort(Port);
end;
Du definierst dir die lokale Variable Port, weisst ihr nirgendwo einen Wert zu und dann übergibst du diese an die LesePort() Funktion? Wovon soll sie denn nun lesen? bisher tut sie dieses von irgendwelchen Ports, nur nicht denen die du meinst.

Delphi-Quellcode:
procedure TForm1.RadioGroup1Click(Sender: TObject);
var
  Port:Word;
begin
  Port:=$279;
  
  case RadioGroup1.ItemIndex of
    0 : Port := $278;
    1 : Port := $279;
    2 : Port := $27A;
  end;
end;
Hier gleiches - so eine schöne Auswahl, aber alles wird einer lokalen Variable zugewiesen. Wozu?

Alle lokalen Variablen (also in einer Procedure definierten Variablen) haben beim Eintritt in die Procedure zufällige Werte und müssen daher initialisiert werden um benutzt zu werden. Ansonsten spielst du Lotto...
Und: lokale Variablen werden mit dem Verlassen (am Ende dieser bzw. ein Exit) der Procedure ungültig und verlieren ihren Inhalt.

MfG
Muetze1
  Mit Zitat antworten Zitat
Capable
 
#27
  Alt 8. Feb 2005, 00:40
morgen muetze,

schön, dass du mir wieder hilfst.
also ich hab schon verstanden. die variable, die ich in der einen procedur deklariere, wird in der anderen nicht wieder erkannt, da lokal.

ich überleg mir später, wie ich das mit der radiogroup mache. aber mein problem besteht auch nicht wirklich darin.

es passiert auch sonst nichts. in der zwischenzeit hab ich mir mal die mühe gemacht alle werte anzupassen, doch funktionieren tut nichts

edit
  Mit Zitat antworten Zitat
BRunner77

 
Delphi 5 Enterprise
 
#28
  Alt 8. Feb 2005, 11:20
Moin!

1. Definiere Port in deiner Form

2. Ist die Portadresse 278h die richtige?

3. Warum fragst du die Bits mit  Value And $64 = $64 ab? Damit fragst du gleich mehrere Bits ab - weil die Zahlen die du verwendest müssten dezimal angegeben werden damit es einzelne gesetzte Bits sind (siehe Taschenrechner von Windows: dezimal eingeben -> binäre Darstellung; hexadezimal eingeben -> binäre Darstellung (vorher in den wissenschaftlichen Modus des Taschenrechners umschalten)).

MfG
Muetze1

// UPS, falscher Account - naja, egal, kommt ja auf den Inhalt an...
  Mit Zitat antworten Zitat
Capable
 
#29
  Alt 8. Feb 2005, 16:34
Zitat von BRunner77:
Moin!
moin muetze,

Zitat:
1. Definiere Port in deiner Form
das hab ich mittlerweile hinbekommen.

Zitat:
2. Ist die Portadresse 278h die richtige?
ja, so steht es in der systemsteuerung von windows 98se

Zitat:
3. Warum fragst du die Bits mit  Value And $64 = $64 ab? Damit fragst du gleich mehrere Bits ab - weil die Zahlen die du verwendest müssten dezimal angegeben werden damit es einzelne gesetzte Bits sind (siehe Taschenrechner von Windows: dezimal eingeben -> binäre Darstellung; hexadezimal eingeben -> binäre Darstellung (vorher in den wissenschaftlichen Modus des Taschenrechners umschalten)).
ganz einfach: so steht es im beispiel aus der ersten seite dieses threads.
das problem ist, dass ich eben erst ein halbes jahr delphi-kurs hinter mir habe und den hintergrund oft noch nicht verstehe.

was du mir sagen willst ist, dass ich

$16 in $10
$32 in $20
$64 in $40
$128 in $80

abändern soll, oder?

weil die dezimalzahlen umgewandelt in hexadezimalen?

um ehrlich zu sein verstehe ich die funktion der ganzen zeile

 IF Value AND $01 = $01 then ShowMessage('Pin 1 ist gesetzt: Databit 0'); nicht.

hm, ist wirklich nicht so einfach, wie ich mir das vorgestellt habe. ich kämpfe gerade mit 2 dicken büchern und massig internet infos (meist in englisch).
  Mit Zitat antworten Zitat
Muetze1
 
#30
  Alt 8. Feb 2005, 16:57
Moin!

Zitat von Capable:
was du mir sagen willst ist, dass ich

$16 in $10
$32 in $20
$64 in $40
$128 in $80

abändern soll, oder?
Ganz genau - es wurden die richtigen Zahlen genommen, aber leider wurden sie mit dem $ davor zu hexadezimalzahlen und damit wieder falsch.

 IF Value AND $01 = $01 then ShowMessage('Pin 1 ist gesetzt: Databit 0'); Der Wert Value beinhaltet ein Wert und dieser wird durch die unterschiedlichen Bits dargestellt. Um abzufragen ob einzelne Bits gesetzt sind oder nicht maskiert man sie aus. Dies geschieht durch eine binäre UND Verknüpfung. Dabei verknüpft man den Wert mit einer Maske. Bei einer UND Verknüpfung ist es so, dass nur die Bits gesetzt bleiben die auch in der Maske gesetzt sind - alle anderen werden auf 0 gesetzt. Und wenn nun in deinem Value das Bit 0 und Bit 1 gesetzt ist (Value = 3) und du eine UND Verknüpfung mit einem gesetzten Bit 0 und Bit 2 machst (5), dann wird Bit 0 und Bit 2 unverändert gelassen bei dem Wert und alle anderen Bits werden auf 0 gesetzt. Somit kannst du danach abfragen ob das Ergebnis <> 0 ist, was dann bedeutet das entweder Bit 0 oder Bit 2 gesetzt ist - oder beide.

Delphi-Quellcode:
     0000 0001b
AND 0000 0001b
= 0000 0001b

     0101 0101b
AND 1100 0011b
= 0100 0001b
Im Ergebnis sind immer nur die Bits gesetzt die in beiden Werten gesetzt sind - Wert und Maske. Daher auch UND ...

Die obige Abfrage in Delphi macht folgendes: Sie führt eine binäre UND-Verknüpfung mit dem Wert aus und einer Maske wo nur Bit 0 gesetzt ist. Danach fragt sie ab, ob das Ergebnis dieser Verknüpfung ein Wert mit gesetztem 0. Bit ist - alle anderen Bits können nicht mehr gesetzt sein. So gehen alle anderen IF Anweisungen auch vor - sie führen diese UND Verknüpfung durch - nacheinander für Bit 0, Bit 1, Bit 2, Bit 3, Bit 4, etc

@flomei:
Zitat von Muetze1:
@flomei:

Erklär mal bitte auch, das es eine Basisadresse gibt und dann die Register immer nur ein fester Offset von dieser Basisadresse ist.
Und bitte die Bit Abfrage korrigieren, also nicht If ( Value And $64 ) = $64 Then sondern If ( Value And 64 ) = 64 Then oder die richtigen Hexadezimalwerte dafür nutzen ($01, $02, $04, $08, $10, $20, $40, $80).

MfG
Muetze1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 18:05 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