mikrocontroller.net

Forum: PC-Programmierung Wie Ports unter MS-Win auslesen/beschreiben?


Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe versucht ein einfaches C-Programm, das auf ein paar Ports 
liest/schreibt und unter Linux problemlos arbeitet, unter MS-Win 
(Cygwin) mit dem gcc zu compilieren, aber dort fehlen die üblichen 
Port-Befehle und die Linux-spezifischen Include-Dateien (speziell 
<sys/io.h>).
Wie kann man denn die Ports unter MS-Win auslesen und beschreiben?

Als Workaround könnte man die Assembler-Definitionen der 
Port-Funktionien nehmen, aber es sollte doch auch einfacher gehen.

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Google nach "giveio.sys"

Da findest Du z.B.

http://www.nf.fh-nuernberg.de/~jesorsky/skript-c/port.htm

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, aber nun habe ich mit dem Beispiel-Programm ein anderes Problem:

Zuerst:

$ gcc -O2 -o port.exe port.c
port.c:12:19: conio.h: No such file or directory

und dann, nach ändern von

#include <conio.h>

in

#include <mingw/conio.h>

gibt es das Problem, das _mingw.h nicht gefunden wird.
Irgendwelche Vorschläge?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Suche nach den Stichworten, hier cygwin + gcc + conio.h + No such file 
or directory

Du findest z.B. http://www.cygwin.com/ml/cygwin/1999-09/msg00198.html

Autor: Feadi F. (feadi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm einfach meinen Code, der braucht nur eine einzige include Datei:
#include <windows.h>


uint8_t inb( uint16_t portaddr )
{
  uint8_t value;

  asm volatile
  (
    "in %1, %0" :
    "=a" (value) :
    "d" (portaddr)
  );

  return value;
}

void outb( uint8_t value, uint16_t portaddr )
{
  asm volatile
  (
    "out %1, %0" ::
    "d" (portaddr), "a" (value)
  );
}

bool iopl()
{
  bool ret;

  HANDLE h;
  h = CreateFile("\\\\.\\giveio", GENERIC_READ,
    0, NULL, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, NULL);

  ret = h != INVALID_HANDLE_VALUE;
  CloseHandle(h);

  return ret;
}

  

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, also mit diesem Beispiel-Programm scheint es zu funktionieren:

#include <windows.h>
#include <stdint.h>
#include <stdio.h>

uint8_t inb( uint16_t portaddr )
{
  uint8_t value;

  asm volatile
  (
    "in %1, %0" :
    "=a" (value) :
    "d" (portaddr)
  );

  return value;
}

void outb( uint8_t value, uint16_t portaddr )
{
  asm volatile
  (
    "out %1, %0" ::
    "d" (portaddr), "a" (value)
  );
}

int iopl()
{
  int ret;

  HANDLE h;
  h = CreateFile("\\\\.\\giveio", GENERIC_READ,
    0, NULL, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, NULL);

  ret = h != INVALID_HANDLE_VALUE;
  CloseHandle(h);

  return ret;
}

int main ()
{
  uint8_t u8=0;

  iopl();
  u8 = inb(888); // read from the parallel port
  fprintf(stdout,  "Read %hu from port 888.\n");
  return 0;
}

Autor: Feadi F. (feadi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso hast Du den Rückgabewert von iopl nach int gewechselt? Ich habe 
mir ursprünglich dabei gedacht, dass diese Funktione den Erfolg mit true 
signalisiert.

So zu benutzen:
int main()
{
  if ( !iopl() )
  {
    // giveio.sys ist auf diesem system nicht installiert
    error( "giveio.sys nicht installiert!" );
    return -1;
  }

  return 0;
}

  

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das bool rausgenommen, a) weil es das in ANSI-C nicht gibt (da 
gibt's nur _Bool und dafür benötigt man stdbool.h) und b) ist _Bool 
überflüssig (>0 ist true, 0 ist false). Meist ist es nämlich so 
implementiert:

#ifndef __cplusplus

#define bool  _Bool
#define true  1
#define false  0

#else /* __cplusplus */

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also das Testen ergab, das das Schreiben funktioniert, aber das Lesen 
nicht: Ich lese immer 4304, beispielsweise von 888 und 889, selbst wenn 
dort am Parallelport Signale anliegen.
Irgendwelche Vorschläge?

Autor: Feadi F. (feadi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
- Du solltest auf jeden Fall den Rückgabewert von iopl prüfen:
  if ( !iopl() )
  {
    // giveio.sys ist auf diesem system nicht installiert
    error( "giveio.sys nicht installiert!" );
    return -1;
  }

- Welches Windows benutzt Du? Mit der 64 Bit Edition funktioniert das 
nämlich nicht.

Autor: Feadi F. (feadi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber mit dieser Zeile wird das auch nichts:
  fprintf(stdout,  "Read %hu from port 888.\n");

besser ist:
  fprintf(stdout,  "Read %hu from port 888.\n", u8 );

  

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, also:

- mit Argument liefert das fprintf auch einen Wert

- das Einlesen klappte nicht, weil die Status-Pins einen kleinen 
Eingangswiderstand haben; mit stärkeren Signalen, z. B. Ping 10 auf 
Masse, geht es

- iopl gibt 1 zurück, aber es funktioniert trotzdem

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.