Forum: PC-Programmierung c-Programm - erster Versuch


von Obermayer F. (Firma: tbd) (foikei)


Lesenswert?

hallo,

ich habe dabei, mich in C etwas einzuarbeiten...echt faszinierend.

Hab mir so ein Programm zum Einlesen von GPIOs auf meinem 
BeagleBoneBlack gesucht.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4
#include <unistd.h>
5
#include <errno.h>
6
#include <fcntl.h>
7
#include <dirent.h>
8
#include <linux/input.h>
9
#include <sys/types.h>
10
#include <sys/stat.h>
11
#include <sys/select.h>
12
#include <sys/time.h>
13
#include <termios.h>
14
#include <signal.h>
15
 
16
void handler (int sig)
17
{
18
  printf ("nexiting...(%d)n", sig);
19
  exit (0);
20
}
21
 
22
void perror_exit (char *error)
23
{
24
  perror (error);
25
  handler (9);
26
}
27
 
28
int main (int argc, char *argv[])
29
{
30
  struct input_event ev[64];
31
  int fd, rd, value, size = sizeof (struct input_event);
32
  char name[256] = "Unknown";
33
  char *device = NULL;
34
 
35
  //Setup check
36
  if (argv[1] == NULL){
37
      printf("Please specify (on the command line) the path to the dev event interface devicen");
38
      exit (0);
39
    }
40
 
41
  if ((getuid ()) != 0)
42
    printf ("You are not root! This may not work...n");
43
 
44
  if (argc > 1) {
45
    device = argv[1];
46
    } 
47
printf ("\n%s\n\t", device);
48
 
49
  //Open Device
50
  fd = open (device, O_RDONLY);
51
  printf ("\nfd vor Abfrage = %i", fd);
52
  //Open Device.1
53
  if (fd == -1) {
54
    printf ("%s is not a vaild device.n", device);
55
    } 
56
  printf ("\nfd NACH Abfrage = %i", fd);
57
 
58
  //Print Device Name
59
  ioctl (fd, EVIOCGNAME (sizeof (name)), name);
60
  printf ("Reading From : %s (%s)n", device, name);
61
 
62
  while (1){
63
      if ((rd = read (fd, ev, size * 64)) < size)
64
          perror_exit ("read()");     
65
 
66
      value = ev[0].value;
67
 
68
      if (value != ' ' && ev[1].value == 1 && ev[1].type == 1){ // Only read the key press event
69
       printf ("Code[%d]n", (ev[1].code));
70
      }
71
  }
72
 
73
  return 0;
74
}

Auf dem BBB compiliere ich mit
1
gcc C_Key_test.c -o C_Key_test

Mein Problem ist, dass es mir so vorkommt, dass die Zeile nach "//Open 
Device.1" nicht ausgeführt wird. Jedenfalls zeigt er mir nie den "Device 
Name" an.
Um ein gewisses "Debugging" durchführen zu können, habe ich ein paar 
printf-Zeilen eingefügt.

Ich komme vom AVR-Assembler...da weiß ich, wo ich hinschauen muss...aber 
hier bin ich echt zu neu.

Kann mich einer auf den richtigen Weg schubsen?

Danke euch!

mfg
foikei

von Klaus W. (mfgkw)


Lesenswert?

Obermayer Florian schrieb:
> //Setup check
>   if (argv[1] == NULL){

schlauer wäre es, so etwas an argc fest zu machewn.

: Bearbeitet durch User
von Klaus W. (mfgkw)


Lesenswert?

Obermayer Florian schrieb:
> hallo,
> ...
>   int fd, rd, value, size = sizeof (struct input_event);

für Größen ist der Typ size_t angemessener.

von Klaus W. (mfgkw)


Lesenswert?

Obermayer Florian schrieb:
> //Open Device.1
>   if (fd == -1) {
>     printf ("%s is not a vaild device.n", device);
>     }
>   printf ("\nfd NACH Abfrage = %i", fd);

Wenn fd==-1 ist, macht es keinen Sinn, mit fd weiter zu arbeiten.

von Klaus W. (mfgkw)


Lesenswert?

Obermayer Florian schrieb:
> Mein Problem ist, dass es mir so vorkommt,

eine genaue Fehlerbeschreibung ist das nicht... :-)

von Easylife (Gast)


Lesenswert?

Der Output von printf wird in der Regel bis zum nächsten Newline 
gebuffert.
Da du konsequent "n" statt "\n" in deinen printf-Aufrufen verwendest, 
wird alles in eine Zeile geklatscht, bis der buffer voll ist, und das 
kann dauern...

von Obermayer F. (Firma: tbd) (foikei)


Lesenswert?

Danke euch für die Antworten. Werd mich heut abend mal daran machen.

Sorry für die ungenaue Fehlerbeschreibung...hab das Thema schon seit 
Tagen mit mir rumgetragen und gestern scheinbar zu müde, um mich 
verständlich auszudrücken zzzzz

von Rolf M. (rmagnus)


Lesenswert?

Easylife schrieb:
> Der Output von printf wird in der Regel bis zum nächsten Newline
> gebuffert.
> Da du konsequent "n" statt "\n" in deinen printf-Aufrufen verwendest,
> wird alles in eine Zeile geklatscht, bis der buffer voll ist, und das
> kann dauern...

Lustigerweise nur, wenn es am Ende des Strings steht. Wenn's am Anfang 
eines Strings steht, ist das '\' da:

Obermayer Florian schrieb:
> printf ("\nfd NACH Abfrage = %i", fd);

von Tom (Gast)


Lesenswert?

Easylife schrieb:
> Der Output von printf wird in der Regel bis zum nächsten Newline
> gebuffert.

Deshalb schreibt man Fehler/Info/Debug-Texte grundsätzlich immer nach 
stderr (das nicht gebuffert ist)

fprintf(stderr, "error!");

von Klaus W. (mfgkw)


Lesenswert?

Aber auch da schadet ein \n am Ende nicht, wenn man mehrere Ausgaben 
ausienanderhalten will...

von Obermayer F. (Firma: tbd) (foikei)


Lesenswert?

Guten Morgen,

das mit dem "n" und "\n" hab ich eigentlich genau so vom Erdenker des 
Codes kopiert
http://www.thelinuxdaily.com/2010/05/grab-raw-keyboard-input-from-event-device-node-devinputevent/

aber echt interessant. Wie gesagt...ich werde mich da mal dran machen, 
wenn ich Zeit hab. Danke für die Tipps.

von Karl H. (kbuchegg)


Lesenswert?

Obermayer Florian schrieb:
> Guten Morgen,
>
> das mit dem "n" und "\n" hab ich eigentlich genau so vom Erdenker des
> Codes kopiert

Du scheinst nicht begriffen zu haben, dass es in C einen Zeichensatz 
gibt. Der umfasst alle üblichen Druckbaren Zeichen, wie 'a', 'b', 'c' 
... natürlich auch 'n', 'm' ... 'z' und noch viele andere. Und er 
umfasst auch Zeichen, für die es keine durckbare Version gibt, die sich 
aber auf die Ausgabe auswirken. Dazu gehören zum Beispiel der Tabulator 
'\t' bzw. auch der Zeilenvorschub. Diesen speziellen Zeichen ist 
gemeinsam, dass sie allesamt in der visuellen Version, so wie man sie im 
C Code schreibt, mit dem Fluchtsymbol \ eingeleitet werden. D.h. die 
Kombination aus \ mit einem weiteren Buchstaben gilt als 1 Zeichen, 
wobei der Buchstabe dann seine normale Funktion als Buchstabe verliert 
und in Kombination mit dem \ dann eines dieser Sonderzeichen 
repräsentiert.
Und so steht ein einzelnes 'n' dann eben für den tatsächlichen 
druckbaren Buchstaben Ennn, während '\n' für den Zeilenvorschub steht. 
Zwischen den beiden gibt es also einen fundamentalen Unterschied.

Wenn du in C weiter kommen willst, dann empfehle ich den Ankauf eines 
Buches. Nichts gegen online-Tutorien. Aber die meisten sind nicht 
wirklich so umfangreich um auch auf die kleinen Details einzugehen, die 
aber nicht minder wichtig sind.

: Bearbeitet durch User
von Dirk B. (dirkb2)


Lesenswert?

Obermayer Florian schrieb:
> das mit dem "n" und "\n" hab ich eigentlich genau so vom Erdenker des
> Codes kopiert

Da wird dann irgendwo bei der Umsetzung nach HTML der \ verloren 
gegangen sein.

von Genussmensch (Gast)


Lesenswert?

> während '\n' für den Zeilenvorschub steht.

 ∖n ╲n ⧵n ⧷n ⧹n ﹨n \n

:-))

von Obermayer F. (Firma: tbd) (foikei)


Lesenswert?

hallo Karl-Heinz,

habe hier zwei Bücher über C/C++ von einem gewissen Helmut Erlenkötter. 
Aber trotzdem danke für die Information.

Ok...dann hab ich das mit den Escapesquenzen doch richtig verstanden. 
Habe mich schon gewundert.
Möglicherweise irgendein Kopierfehler, ja...macht ja sonst überhaupt 
keinen Sinn.

Klaus Wachtler schrieb:
> Wenn fd==-1 ist, macht es keinen Sinn, mit fd weiter zu arbeiten.

stimmt...war eben nur zu "Debug-Zwecken". Hätte auch nur "Hallo" 
schreiben können.

ok. Ich hab die Escapesequenzen richtig eingegeben. Schaut bedeutend 
besser aus.

Danke euch soweit für die Hilfen!

mfg
Florian

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.