www.mikrocontroller.net

Forum: PC-Programmierung Port-Befehle unter Borland C++Builder 6 ?


Autor: Rolf F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal versucht ein Code-Beispiel aus diesem Forum, was unter
Borland C++ 3.1 gemacht wurde, unter der neueren Version 6 zu
compilieren, aber das scheitert an Port-Befehlen wie

outp (0x378, 0xff);

um 0xff über den ersten Parallelport auszugeben.
Wo hat Borland die Port-Befehle denn versteckt?
Über die Hilfe des Programms war nichts zu finden und die Fehlermeldung
sagt auch nichts dazu.

Autor: Andreas Sag ich nicht (andreash)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

dazu musst Du die Windows-Befehle ReadFile, WriteFile usw. benutzen.
Such mal im Code-Forum. Da gibt es einige Beispiele dazu.

Grüße
andreas

Autor: Rolf F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das was zu ReadFile und WriteFile zu finden war, ist Zugriff auf
Block-Devices; ich brauche aber aber Zugriff auf I/O-Ports, die etwas
ganz anderes sind.

Mir ist eigentlich der Compiler egal; ich will nur unter MS-Win auf
I/O-Ports zugreifen.
Das kann doch nicht so schwer sein, auch wenn die Compiler-Hersteller
die Befehle dafür alle paar Jahre umbenennen.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

es sind hier nicht die Compilerhersteller, die Dinge umbenennen,
sondern Betriebssysteme die zusätzliche Abstraktionsebenen enthalten...
Windows will einfach nicht, dass du direkt auf Hardwareebene
rumfummelst, dazu hat es Treiber zu geben, das ist der ganze Punkt.
Such' mal nach "giveio", vielleicht hilft dir das was.

Autor: Rolf F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht ja gerade um einen Treiber; der muss direkt auf die Hardware
zugreifen; der ist die Abstraktionsebene.
Das Problem beim PC ist nur, dass es keinen separten I/O-Space gibt,
auf dem man ANSI-C zugreifen kann, sondern nur über I/O-Befehle;
ansonsten wären Port-Zugriffe einfach auf feste absolute Adressen, so
wie beispielsweise auf ARM.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hol Dir von
http://www.driverlinx.com/DownLoad/DlPortIO.htm

den DLPortIO.
Das ist ein Treiber, der Dir den Zugriff auf die Ports
unter Win2K, WinXP ermoeglicht. Die DLL stellt Dir
entsprechende Aufrufe zur Verfuegung. Sie kommt mit
Beispielen in C und VB.

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Es geht ja gerade um einen Treiber; der muss direkt auf die Hardware
>zugreifen; der ist die Abstraktionsebene.
>Das Problem beim PC ist nur, dass es keinen separten I/O-Space gibt,
>auf dem man ANSI-C zugreifen kann, sondern nur über I/O-Befehle;
>ansonsten wären Port-Zugriffe einfach auf feste absolute Adressen, so
>wie beispielsweise auf ARM.

über in und out greifst du auf einen separaten IO Space zu!

niemand hindert dich in Borland C zu schreiben
asm
mov dx,378
mov al,0xff
out dx,al
end;
sollte eigentlich noch funktionieren
Die Sache ist nur ,dein Programm muss auch berechtigt sein dies zu tun,
sonst wird es mit einer exception wegen unerlaubten Hardwarezugriffs
rausgeschmissen! Du kannst davon ausgehen das ein Programm das einen
solchen Zugriff mach mit sicherheit kein .exe Programm ist sondern nur
ein Treiber.
Solltest du "nur auf der parallelen Schnittstelle etwas ausgeben
wollen nimm wie oben empfohlen ReadFile/Writefile und suche in der MSDN
nach DCB und CreateFile.
Wenn du mit allen Leitungen spielen willst nimm obengenannte Links.
Solltest du für eine unbekannte Parallele Karte einen Treiber schreiben
wollen dann, such nach DDK (driver development Kit).
Also vorausgesetzt du willst unter Windows Programmieren.

Autor: Rolf F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, dann nehme ich Assembler.
Dass man für ein bischen Pin-Wackeln so einen Aufwand treiben muss,
gibt's wohl nur unter MS-Win. Meine 10 Jahre jungen User-Space-Treiber
unter Linux funktionieren immer noch ohne Änderung am Sourcecode.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Dass man für ein bischen Pin-Wackeln so einen Aufwand treiben muss,
> gibt's wohl nur unter MS-Win.

Du ueberschaetzt den Aufwand gewaltig.
Hol dir den Treiber, installier ihn und schon gehts los in
C oder C++. Header inkludieren und ein paar Funktionen, ala
ReadByte(), WriteByte() aufrufen sind wahrlich kein Aufwand.

Autor: Olaf Stieleke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch die Assembler-Arie wird unter Windows NT,2K,XP und höher knallhart
mit einer Exception bestraft. Kein Programm darf direkt auf
Hardware-Ports zugreifen - dies wird bereits im Prozessor verhindert.

Unter den genannten Betriebssystemen kommst du um eine Brücke wie
DLPortIO (die ich selbst schon sehr oft benutzt habe) nicht herum.

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Meine 10 Jahre jungen User-Space-Treiber
>unter Linux funktionieren immer noch ohne Änderung am Sourcecode.

Aber auch nur solange du Zugriffsberechtigt bist als Nutzer und kein
anderer Prozeß den Port geöffnet hat. Das sollte dir eigentlich schon
vor 10 Jahren aufgefallen sein. Linux hat nämlich den beschränkten
Portzugriff schon viel früher eingeführt.
Der Assemblerzugriff auf die Ports wird auch nur bei
Zugriffsberechtigung gehen und die hat nur ein Treiber dem dieser
Portbereich gehört.
Dein bißchen "Pin-Wackeln" kannst du mit ReadFile und WriteFile
machen.
Solange es nur die Datenpins betrifft. Das entspricht read und write.

Autor: Rolf F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie kann ich von I/O-Ports einlesen, also beispielsweise vom
Parallelport einlesen?
Das ASM-Beispiel zum schreiben hilft mir da nicht weiter.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du Dir schon einen Treiber geholt?
zb. http://www.driverlinx.com/DownLoad/DlPortIO.htm

Dort lautet der Zugriff zb so:

m_dwValue = DlPortReadPortUchar(m_dwAddr);

Mitgeliefert wird auch

  DLportbc.lib  -- Import library - Borland C\C++

einfacher gehts wohl wirklich nimmer.

Autor: Rolf F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok; wird gemacht.

Autor: herp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
m_dwValue = DlPortReadPortUchar(m_dwAddr)

vs

        b = inb(addr)

ganz schoen geschwaetzig, das teil!

g

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verpass ihm halt einen Maulkorb

#define inb DlPortReadPortUchar

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.