c-Programm - erster Versuch

OP (Firma: tbd) #3924226
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
Gast #3924504
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...
#3924554
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);
#3926250
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.
OP (Firma: tbd) #3928821
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren