Programmpause bis parport0 sich ändert?

B

blacky

Hallo, ich habe folgendes geschrieben:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <linux/ppdev.h> 
#include <sys/ioctl.h>

#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))

int main(int argc, char *argv[])
{
int port;
unsigned char data=0xFF;

port = open("/dev/parport0", O_RDWR);

if ( port == -1 )
{
  printf("Error");
}
ioctl( port, PPCLAIM, NULL );

while (CHECK_BIT(data, 4))
{
usleep(50000);
ioctl( port, PPRSTATUS   , &data );
printf("Der Wert ist %d\n", data);
}


ioctl( port, PPRELEASE, NULL );
close( port );

return EXIT_SUCCESS;
}
Wie man erkennen kann, wird einfach das Statusregister der parallelen Schnittstelle abgefragt. Wenn BIT 4 des Statusregisters 0 ist, wird die Schleife verlassen. Nun möchte ich die Schleife weg bekommen, weil diese die ganze Zeit CPU Zeit beansprucht. Das konnte ich mit dem usleep Befehl zwar minimieren aber sauber ist es denke trotzdem nicht. Jetzt möchte ich, dass das Programm komplett pausiert, bis sich im Statusregister etwas ändert. Wie kann ich das erreichen? Sind Interrupts der richtige Ansatz? Wäre super wenn ihr auch ein Beispiel machen könntet!
Danke im voraus!
 
Hi,

ohne wirklich Ahnung zu haben: laesst sich das nicht eventuell wie in der Socket Programmierung mit Select machen (sys/select.h)? Select kann schliesslich mit beliebigen File Deskriptoren arbeiten.
Zumindest wuerde dann solange geblockt, bis etwas gelesen werden kann. Ob das tatsaechlich sinnvoll ist, haengt wahrscheinlich auch davon ab, wieviele Daten so an dem Port ankommen.

Doch das ist wie gesagt nur ein rundstreunender Gedanke, Erfahrung habe ich damit keine.

mfg,
bytepool
 
Nunja, richtig viele Daten sind das nicht :D , es geht hier eigentlich nur um einen Schalter.
 

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

USB Geräte per Bash Script resetten (Gerät hängt sich öfter mal auf)

Modulfehler?

Segmentation Fault bei strcat?

fußballstatistik auswerten

Zurück
Oben