Ports benutzen (Windows)

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Allgemein

Achtung — veraltet!

Keinesfalls sollte giveio.sys eingesetzt werden, da diese Lösung unter 64-Bit-Windows nicht (mehr) funktioniert. Vorzuziehen ist inpout32.dll bzw. inpoutx64.dll. Jene Bibliothek kümmert sich selbständig um das Installieren des Treibers, auch unter 64 Bit. Assembler-Anweisungen sind nicht erforderlich, und davon ist dringend abzuraten. DLL-Einsprünge erlauben die einfache DLL-seitige Anpassung auf USB-Geräte, welche auch immer.

Beispiel

Nach einem Forenbeitrag von Feadi aus Frankreich.

// v 1.3
// GCC Compiler wg. Inline-ASM
// Installiertes giveio.sys erforderlich (s. Weblinks)
//
#include <windows.h>
#include <stdint.h>
#include <stdio.h>

#ifndef __cplusplus
typedef enum {false,true} bool;	// gibt's nicht in C!
#endif

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;
}

int main (void)
{
  uint8_t u8=0;

  if ( !iopl() )
  {
    // giveio.sys ist auf diesem system nicht installiert
    error( "giveio.sys nicht installiert!" );
    return -1;
  }

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

Serielle Schnittstelle (RS232)

Siehe auch

Weblinks