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
voidhandler(intsig)
17
{
18
printf("nexiting...(%d)n",sig);
19
exit(0);
20
}
21
22
voidperror_exit(char*error)
23
{
24
perror(error);
25
handler(9);
26
}
27
28
intmain(intargc,char*argv[])
29
{
30
structinput_eventev[64];
31
intfd,rd,value,size=sizeof(structinput_event);
32
charname[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
return0;
74
}
Auf dem BBB compiliere ich mit
1
gccC_Key_test.c-oC_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
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.
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...
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
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);
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!");
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.
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.
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