c-Programm - erster Versuch

OP (Firma: tbd) #3924226
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
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...
OP (Firma: tbd) #3924548
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
#3924554
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
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
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

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.