Forum: PC-Programmierung Parallel Port Pin setzten


von huGO (Gast)


Lesenswert?

Hallo,
kann jemand mal ein kleines c posten das eine LED am Parllel Port zum 
blinken bringt (d.h Ich möchte einfach einen Pin setzten können)

mfg huGO

: Verschoben durch User
von huGO (Gast)


Lesenswert?

Also ungefähr so:

Set Pin1

usleep(233);

Reset Pin1

von spess53 (Gast)


Lesenswert?

Hi

Wovon redest du? PC?

MfG Spess

von huGO (Gast)


Lesenswert?

ja von Pc.
Auf dem pc läuft linux.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

1
 #include <unistd.h>
2
#include <sys/types.h>
3
#include <sys/stat.h>
4
#include <fcntl.h>
5
6
fd = open("/dev/parport0", O_WRONLY | O_APPEND);
7
char on = 0xFF;
8
char off = 0;
9
while (1) {
10
  write(fd, &on, 1);
11
  usleep (233);
12
  write (fd, &off, 1);
13
  sleep (233);
14
} close(fd);

von Manuel (Gast)


Lesenswert?

und jetzt mal bitte für Vista :-)

von huGO (Gast)


Lesenswert?

Vielen Dank Niklas.
Ich hab jetzt noch eine Frage, setzt du den Pin wirklich auf 1 oder 
schikst du daten auf den Pin?

von Manuel (Gast)


Lesenswert?

@huGO

hmm sind "1" keine Daten... Ich denke das ist ja eher eine 
philosophische Frage, oder??

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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.

von huGO (Gast)


Lesenswert?

ups stimmt.

der code kann aber leider nicht kompiliert werden :(
folgende Fehler erscheinen:
1
bt Desktop # cc -o io1 io.c
2
io.c:7: warning: data definition has no type or storage class
3
io.c:7: error: initializer element is not constant
4
io.c:10: error: expected identifier or '(' before 'while'
5
io.c:15: warning: data definition has no type or storage class
6
io.c:15: warning: parameter names (without types) in function declaration

von huGO (Gast)


Lesenswert?

oh es hat ja main() gefehlt :D

jetzt kommt nur noch folgender Fehler:

io.c:7: error: initializer element is not constant

bei folgendem Code:
1
#include <unistd.h>
2
#include <sys/types.h>
3
#include <sys/stat.h>
4
#include <fcntl.h>
5
6
fd = open("/dev/parport0", O_WRONLY | O_APPEND);
7
8
int main() {
9
10
char on = 0xFF;
11
char off = 0;
12
while (1) {
13
  write(fd, &on, 1);
14
  usleep (233);
15
  write (fd, &off, 1);
16
  sleep (233);
17
} close(fd);
18
19
20
}

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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
int want_quit;
8
9
void on_sig_int (int sig) {
10
  want_quit = 1;
11
}
12
13
int main(int argc, char* argv[]) {
14
  fd = open("/dev/parport0", O_WRONLY | O_APPEND);
15
  char on = 0xFF;
16
  char off = 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.

von huGO (Gast)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

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:
1
#include <unistd.h>
2
#include <sys/types.h>
3
#include <sys/stat.h>
4
#include <fcntl.h>
5
#include <signal.h>
6
7
int want_quit;
8
9
void on_sig_quit (int sig) {
10
  want_quit = 1;
11
}
12
13
int main(int argc, char* argv[]) {
14
  FILE fd = open("/dev/parport0", O_WRONLY | O_APPEND);
15
  char on = 0xFF;
16
  char off = 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
}

von Sven P. (Gast)


Lesenswert?

Und dann bitte noch sicherheitshalber ein volatile vor want_quit...

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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 ?

von Daniel (Gast)


Lesenswert?

stimmt, hatte ich übersehen :o

von Uwe Bonnes (Gast)


Lesenswert?

@Manuel:
"\\\\.\\$VDMLPT1" hat in Win32 etwa gleiche Funktionalitaet wie 
/dev/parport. Wird in hamlib und xc3sprog (sourceforge) benutzt.

Tschuess

von Rolf Magnus (Gast)


Lesenswert?

> 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.

von Sven P. (Gast)


Lesenswert?

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:
1
volatile sig_atomic_t xxx;

von Peter (Gast)


Lesenswert?

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.

von ahha (Gast)


Lesenswert?

hallo,
ich hab jetzt mal ine dumme frage aber welcher pin wird jetzt eig. 
gesetzt?

von Daniel (Gast)


Lesenswert?

char on = 0xFF;

Alle

von D. I. (Gast)


Lesenswert?

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?

von Rolf Magnus (Gast)


Lesenswert?

> Auch wenn der int nicht korrekt aligned ist auf ner 32bit Maschine?

Wenn er das ist, ist was falsch gelaufen.

von D. I. (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

Dann gibt es aber auch kein "nicht korrektes" Alignment.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.