Eventuell sind da noch ein paar Fehler drin.
Aber im Prinzip ginge es so
char gpio0[][3] = {"17","18","21"};
FILE *fp[3]={0};
//Öffnen
int z;
for(z=0;z<3;z++)
{
char buffer[GPIO_FN_MAXLEN+1];
snprintf(buffer, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value",
gpio[z]);
FILE *n=open(buffer,O_RDONLY);
if(n<0)
{
perror(buffer);
fp[z]=0;
}
else
fp[z]=n;
}
//Schliessen
for(z=0;z<3;z++)
if(fp[z])fclose(fp[z]);
Fummel ich mir hin :-)
---
Kannd das sein, das open() kein FILE mag?
311: FILE *n=open(buffer,O_RDONLY);
311:13: warning: initialization makes pointer from integer without a
cast
Das geht
Nov 24 00:56:16 rpi s0vz: /sys/class/gpio/gpio17/value
Nov 24 00:56:16 rpi s0vz: /sys/class/gpio/gpio18/value
Nov 24 00:56:16 rpi s0vz: /sys/class/gpio/gpio21/value
.
Irgendwo ist in der Open-Schleife noch ein Wurm ...
Nov 25 16:40:18 rpi s0vz: :/sys/class/gpio/gpio17/value
Nov 25 16:40:18 rpi s0vz: :Bad file descriptor
Nov 25 16:40:18 rpi s0vz: :/sys/class/gpio/gpio18/value
Nov 25 16:40:18 rpi s0vz: :Bad file descriptor
Nov 25 16:40:18 rpi s0vz: :/sys/class/gpio/gpio21/value
Nov 25 16:40:18 rpi s0vz: :Bad file descriptor
%m ist der letzte Return-Code? Dann von: int n=open(buffer,O_RDONLY); ?!
sind die GPIO's vorher auch aktiviert worden?
Andernfalls gibt es sie nämlich nicht, d.h. Fehler ist korrekt.
Hier mal auf die Schnelle als Shell-Script:
# Set up GPIO 4 and set to output
echo "4" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction
# Set up GPIO 7 and set to input
echo "7" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio7/direction
# Write output
echo "1" > /sys/class/gpio/gpio4/value
# Read from input
cat /sys/class/gpio/gpio7/value
# Clean up
echo "4" > /sys/class/gpio/unexport
echo "7" > /sys/class/gpio/unexport
Was bekommste für nen filedescriptor wenn du das von Hand machst ?
Also ein open("/sys/class/gpio/gpio18/value",O_RDONLY) ?
und
if(n<0)
{
syslog(LOG_INFO, "Error > %m: %s", buffer);
fd_gpio[z]=0;
}
else
fd_gpio[z]=n;
sieht eleganter aus.
noch 'n Tipp
bei
char gpio_pin_id[][6] = {"17", "18", "21", "22", "23", "24"};
steht die 6 nicht für die Anzahl der Einträge.
Es ist ein Wert für die einzelnen Elemente die die Einträge jeweils
Aufnehmen können.
Für Strings mit maximal 2 Zeichen reichen dann 2 + 1(Nullbyte) chars.
char gpio_pin_id[][3] = {"17", "18", "21", "22", "23", "24"};
wieviele INPUT-Werte du dann hast kann man mit sizeof(gpio_pin_id)/3
berechnen.
So bleibts etwas variabler.
(sizeof(gpio_pin_id)/3) sollte 6 ergeben.
Also statt
int inputs = 6;
struct pollfd fds[inputs];
char gpio_pin_id[][6] = {"17", "18", "21", "22", "23", "24"};
int i;
dieses
struct pollfd fds[inputs];
char gpio_pin_id[][3] = {"17", "18", "21", "22", "23", "24"};
int inputs = sizeof(gpio_pin_id)/3;
int i;
Was meinstn?
ich habe nur die Reihenfolge geändert?! Weil der gcc hier maulte:
'inputs' nicht definiert ...
struct pollfd fds[inputs];
char gpio_pin_id[][3] = {"17", "18", "21", "22", "23", "24"};
int inputs = sizeof(gpio_pin_id)/3;
int i;
So, gehts! ->
char gpio_pin_id[][3] = {"17", "18", "21", "22", "23", "24"};
int inputs = sizeof(gpio_pin_id)/3;
struct pollfd fds[inputs];
int i;
Meintest Du das?
Ich hab da nur mal eben was gestutzt.
Hatte noch im Hinterkopf, daß Arrays mit Variabler Länge nicht
generierbar sind. :)
Vergiß es, ich habs ausprobiert. Geht :)
Compilieren geht, aber nach zwei durchläufen steht das Programm ...
Nov 26 21:50:51 rpi s0vz: /sys/class/gpio/gpio17/value
Nov 26 21:50:51 rpi s0vz: /sys/class/gpio/gpio18/value
Henrik Wellschmidt schrieb:> ich glaube, snprintf() kann nur 'char', kein 'int' ...
Also, "%d" kann snprintf definitiv.
Und - gerade ausprobiert - das funktioniert auch, wenn man dem als
Argument ein char verfüttert...
Grüße,
Simon
Simon Budig schrieb:> Henrik Wellschmidt schrieb:>> ich glaube, snprintf() kann nur 'char', kein 'int' ...>> Also, "%d" kann snprintf definitiv.>> Und - gerade ausprobiert - das funktioniert auch, wenn man dem als> Argument ein char verfüttert...
Check!
Aber die Routine läuft nicht mehr durch ... hmm
Henrik Wellschmidt schrieb:> Compilieren geht, aber nach zwei durchläufen steht das Programm ...>> Nov 26 21:50:51 rpi s0vz: /sys/class/gpio/gpio17/value> Nov 26 21:50:51 rpi s0vz: /sys/class/gpio/gpio18/value
Heh, klar :)
Ich empfehle:
Ich kriege gerade Angst, dass Du hier die Größe des Sourcecode-Texts
misst. Wofür?
Als Qualitätsmerkmal taugt das nicht - eher im Gegenteil: Mehr Text
bedeutet meist auch bessere Lesbarkeit. Wenn dann wäre eher interessant
wieviel RAM zur Laufzeit verbraucht wird. Aber das wäre im Moment noch
viel zu früh um sich darüber Gedanken zu machen...
Ansonsten:
Simon Budig schrieb:> Henrik Wellschmidt schrieb:>> Simon, schau mal -> 8 Zeichen mehr :-)>> Bitte meine das als Witz :-)>> Grüße,> Simon
Ok, ich meinte das als Witz ;-)
Zumindest im nachhinein :-D