Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Ansteuern des Parallelports (https://www.delphipraxis.net/5152-ansteuern-des-parallelports.html)

Capable 30. Jan 2005 12:24

Re: Ansteuern des Parallelports
 
editiert

Muetze1 30. Jan 2005 22:16

Re: Ansteuern des Parallelports
 
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

Capable 4. Feb 2005 08:11

Re: Ansteuern des Parallelports
 
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

Muetze1 4. Feb 2005 09:25

Re: Ansteuern des Parallelports
 
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

Capable 7. Feb 2005 21:08

Re: Ansteuern des Parallelports
 
so, ich hab etwas rumprobiert, komm aber zu keinem ergebnis. könnt ihr mir sagen, wo der fehlerteufel steckt?

Delphi-Quellcode:
editiert
es passiert schlichtweg gar nichts.

Muetze1 7. Feb 2005 21:37

Re: Ansteuern des Parallelports
 
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

Capable 7. Feb 2005 23:40

Re: Ansteuern des Parallelports
 
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

Delphi-Quellcode:
edit

BRunner77 8. Feb 2005 10:20

Re: Ansteuern des Parallelports
 
Moin!

1. Definiere Port in deiner Form

2. Ist die Portadresse 278h die richtige?

3. Warum fragst du die Bits mit
Delphi-Quellcode:
 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...

Capable 8. Feb 2005 15:34

Re: Ansteuern des Parallelports
 
Zitat:

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
Delphi-Quellcode:
 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

Delphi-Quellcode:
 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).

Muetze1 8. Feb 2005 15:57

Re: Ansteuern des Parallelports
 
Moin!

Zitat:

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.

Delphi-Quellcode:
 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:

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
Delphi-Quellcode:
If ( Value And $64 ) = $64 Then
sondern
Delphi-Quellcode:
If ( Value And 64 ) = 64 Then
oder die richtigen Hexadezimalwerte dafür nutzen ($01, $02, $04, $08, $10, $20, $40, $80).

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:09 Uhr.
Seite 3 von 4     123 4      

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