Nun, der Code schickt Daten an den Port, welche entweder alle Pins
einschalten (0xFF) oder alle Pins abschalten (0). Man kann natürlich
auch einzelne Pins schalten, z.B. mit dem Wert 8 wird der 4. Pin
eingeschaltet.
Der Code ist auch nicht vollständig, da muss noch eine Funktion
drumherum, z.B.:
1
#include<unistd.h>
2
#include<sys/types.h>
3
#include<sys/stat.h>
4
#include<fcntl.h>
5
#include<signal.h>
6
7
intwant_quit;
8
9
voidon_sig_int(intsig){
10
want_quit=1;
11
}
12
13
intmain(intargc,char*argv[]){
14
fd=open("/dev/parport0",O_WRONLY|O_APPEND);
15
charon=0xFF;
16
charoff=0;
17
want_quit=0;
18
signal(SIGINT,on_sig_quit);
19
while(want_quit==0){
20
write(fd,&on,1);
21
usleep(233);
22
write(fd,&off,1);
23
sleep(233);
24
}
25
close(fd);
26
}
Mit dem signal-Handler wird die Schnittstelle auch ordentlich
geschlossen, wenn man Strg+C drückt. Nicht zwangsweise nötig, aber
sauberer programmiert.
Auch dieser Code funktioniert nicht :(
io.c: In function 'main':
io.c:14: error: 'fd' undeclared (first use in this function)
io.c:14: error: (Each undeclared identifier is reported only once
io.c:14: error: for each function it appears in.)
io.c:18: error: 'on_sig_quit' undeclared (first use in this function)
io.c:26:2: warning: no newline at end of file
Sei so lieb und lerne ein bisschen C.
Das ist nicht böß gemeint, aber die Fehler oben drin sind trivial,
wenn du das Programm später erweitern willst brauchst du das Wissen:
Upps, vertippt :)
Aber, wie kommst du auf "FILE fd"? Sollte das nicht eher "int fd = open
..." sein? FILE* braucht man doch nur bei der gepufferten Version mit
fopen ?
> Und dann bitte noch sicherheitshalber ein volatile vor want_quit...
Eigentlich sollte es eher vom Typ sig_atomic_t sein. Den gibt's nämlich
genau für solche Variablen.
Rolf Magnus schrieb:
>> Und dann bitte noch sicherheitshalber ein volatile vor want_quit...>> Eigentlich sollte es eher vom Typ sig_atomic_t sein. Den gibt's nämlich> genau für solche Variablen.
Interessanterweise ist sig_atomic_t alleine aber nicht volatile :-)
Also:
atomic ist ja wohl etwas übertriben, bei einem int gibt es keinen
ungültigen zwischenwert bei gleichzeitigen zugriff.
volatil habe ich auf einem PC auch noch nie genutzt, ging bis jetzt auch
immer. könnte aber daran liegen das die schleifen meist etwas mehr
inhalt hatten und auf dem PC weniger Register vorhanden sind.
Peter schrieb:
> atomic ist ja wohl etwas übertriben, bei einem int gibt es keinen> ungültigen zwischenwert bei gleichzeitigen zugriff.
Auch wenn der int nicht korrekt aligned ist auf ner 32bit Maschine?
Rolf Magnus schrieb:
>> Auch wenn der int nicht korrekt aligned ist auf ner 32bit Maschine?>> Wenn er das ist, ist was falsch gelaufen.
Nun ja gibt ja durchaus Architekturen die kein zwingendes Alignment
voraussetzen