ANSI C - open() als Schleife

#2930057
Lesenswert?

Hallo *!

kurze Frage, kann man das etwas smarter machen? Mit einer Schleife?
1
char gpio0[] = "17";
2
char gpio1[] = "18";
3
char gpio2[] = "21";
4

5
      snprintf(fn_gpio0, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio0);
6
      fd_gpio0=open(fn_gpio0, O_RDONLY);
7
      if(fd_gpio0<0) 
8
      {
9
        perror(fn_gpio0);
10
        return 1;
11
      }
12
      
13
      snprintf(fn_gpio1, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio1);
14
      fd_gpio1=open(fn_gpio1, O_RDONLY);
15
      if(fd_gpio1<0) 
16
      {
17
        perror(fn_gpio0);
18
        return 1;
19
      }
20
      snprintf(fn_gpio2, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio2);
21
      fd_gpio2=open(fn_gpio2, O_RDONLY);
22
      if(fd_gpio2<0) 
23
      {
24
        perror(fn_gpio0);
25
        return 1;
26
      }
Persönliche Seite #2930072
Lesenswert?

char gpio0[][3] = {"17","18","21"};
FILE (*fp)[3]={0};

//Öffnen

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(fn_gpio0);
  return 1; //Eventuell ein fp[z]=0;
 }
 else
  fp[z]=n;
}

//Schliessen
for(z=0;z<3;z++)
 if(fp[z])fclose(z);
Persönliche Seite #2930074
Lesenswert?

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]);
#2930094
Lesenswert?

Hmm ... siehst Du n Fehler?

1
        char gpio[][3] = {"17","18","21"};
2
        int fp[3]={0};
3

4
        //Öffnen
5
        int z;
6
        for(z=0;z<3;z++)
7
        {
8
          char buffer[GPIO_FN_MAXLEN+1];
9
          snprintf(buffer, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio[z]);
10
          int n=open(buffer,O_RDONLY);
11
          
12
          if(n<0)
13
          {
14
          perror(buffer);
15
          fp[z]=0;
16
          }
17
          else
18
          fp[z]=n;
19
        }

syslog(LOG_INFO, "%s", fd_gpio0);

Nov 24 00:24:33 rpi s0vz: (null)
#2930105
Lesenswert?

Komisch
1
        char gpio[][3] = {"17","18","21"};
2
        int fd_gpio[3]={0};
3

4
        //Öffnen
5
        int z;
6
        for(z=0;z<3;z++)
7
        {
8
          char buffer[GPIO_FN_MAXLEN+1];
9
          snprintf(buffer, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio[z]);
10
          syslog(LOG_INFO, "%s", buffer);
11
          int n=open(buffer,O_RDONLY);
12
          
13
          if(n<0)
14
          {
15
          perror(buffer);
16
          fd_gpio[z]=0;
17
          }
18
          else
19
          fd_gpio[z]=n;
20
        }

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

.
#2930118
Lesenswert?

Du meinst so ->

1
        char gpio[][3] = {"17","18","21"};
2
        int fd_gpio[3]={0};
3

4
        int z;
5
        for(z=0;z<3;z++)
6
        {
7
          char buffer[GPIO_FN_MAXLEN+1];
8
          snprintf(buffer, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio[z]);
9
          int n=open(buffer,O_RDONLY);
10
          syslog(LOG_INFO, "%s", buffer);          
11
        
12
          if(n<0)
13
          {
14
            perror(buffer);
15
            fd_gpio[z]=0;
16
          }
17
          else
18
          fd_gpio[z]=n;
19
        }
20

21

22
    irq=read(fd_gpio[0], rdbuf, RDBUF_LEN-1);
23
    if(irq<0) 
24
    {
25
      perror("read()");
26
      return 4;
27
    }
28
    
29
    irq=read(fd_gpio[1], rdbuf, RDBUF_LEN-1);
30
    if(irq<0) 
31
    {
32
      perror("read()");
33
      return 4;
34
    }
35
    
36
    irq=read(fd_gpio[2], rdbuf, RDBUF_LEN-1);
37
    if(irq<0) 
38
    {
39
      perror("read()");
40
      return 4;
41
    }
#2931902
Lesenswert?

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); ?!
1
        char gpio[][3] = {"17","18","21"};
2
        int fd_gpio[3]={0};
3

4
        int z;
5
        for(z=0;z<3;z++)
6
        {
7
          char buffer[GPIO_FN_MAXLEN+1];
8
          snprintf(buffer, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio[z]);
9
          syslog(LOG_INFO, ":%s", buffer);
10
          int n=open(buffer,O_RDONLY);
11
                
12
          if(n<0)
13
          {
14
            syslog(LOG_INFO, "Error > %m: %s", buffer);
15
            fd_gpio[z]=0;
16
          }
17
          fd_gpio[z]=n;
18
          syslog(LOG_INFO, ":%m");
19
        }
Gast #2931961
Lesenswert?

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
#2931977
Lesenswert?

Klar ;-)

Aber danke für den Tip!

1
pi@rpi ~ $ ls -la /sys/class/gpio/gpio*
2
lrwxrwxrwx 1 root root 0 Nov 24 20:17 /sys/class/gpio/gpio17 -> ../../devices/virtual/gpio/gpio17
3
lrwxrwxrwx 1 root root 0 Nov 24 20:17 /sys/class/gpio/gpio18 -> ../../devices/virtual/gpio/gpio18
4
lrwxrwxrwx 1 root root 0 Nov 24 20:17 /sys/class/gpio/gpio21 -> ../../devices/virtual/gpio/gpio21
5
lrwxrwxrwx 1 root root 0 Nov 24 20:17 /sys/class/gpio/gpio22 -> ../../devices/virtual/gpio/gpio22
6
lrwxrwxrwx 1 root root 0 Nov 24 20:17 /sys/class/gpio/gpio23 -> ../../devices/virtual/gpio/gpio23
7
lrwxrwxrwx 1 root root 0 Nov 24 20:17 /sys/class/gpio/gpio24 -> ../../devices/virtual/gpio/gpio24
8
lrwxrwxrwx 1 root root 0 Nov 25 17:35 /sys/class/gpio/gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
9
pi@rpi ~ $ cat /sys/class/gpio/gpio*/value
10
1
11
1
12
1
13
0
14
0
15
0

Ich überprüfe das hier ->
1
if (fd_gpio[z] < 0 )
2
          {
3
            syslog(LOG_INFO, "Error > %m: %s", buffer);
4
            fd_gpio[z]=0;
5
          }
#2932239
Lesenswert?

:-D

Nov 25 20:03:58 rpi s0vz: VzServer:localhost
Nov 25 20:03:58 rpi s0vz: VzPort:80
Nov 25 20:03:58 rpi s0vz: VzPath:middleware.php
Nov 25 20:03:58 rpi s0vz: :/sys/class/gpio/gpio17/value
Nov 25 20:03:58 rpi s0vz: debug_fp1:2
Nov 25 20:03:58 rpi s0vz: debug_fp2:2
Nov 25 20:03:58 rpi s0vz: :/sys/class/gpio/gpio18/value
Nov 25 20:03:58 rpi s0vz: debug_fp1:3
Nov 25 20:03:58 rpi s0vz: debug_fp2:3
Nov 25 20:03:58 rpi s0vz: :/sys/class/gpio/gpio21/value
Nov 25 20:03:58 rpi s0vz: debug_fp1:4
Nov 25 20:03:58 rpi s0vz: debug_fp2:4
Nov 25 20:03:58 rpi s0vz: debug:2
Nov 25 20:03:58 rpi s0vz: debug:3
Nov 25 20:03:58 rpi s0vz: debug:4

_
1
        char gpio[][3] = {"17","18","21"};
2
        int fd_gpio[3]={0};
3

4
        for ( z=0; z<3; z++ )
5
        {
6
        
7
          char buffer[GPIO_FN_MAXLEN+1];
8
          snprintf ( buffer, GPIO_FN_MAXLEN-1, "/sys/class/gpio/gpio%s/value", gpio[z] );
9
          syslog ( LOG_INFO, ":%s", buffer );
10
          int n = open ( buffer, O_RDONLY );
11
              
12
          if(n<0)
13
          {
14
            syslog(LOG_INFO, "Error > %m: %s", buffer);
15
            fd_gpio[z]=0;
16
          }
17
          else
18
            fd_gpio[z]=n;
19
            syslog ( LOG_INFO, "debug_fp1:%d", n );
20
            syslog ( LOG_INFO, "debug_fp2:%d", fd_gpio[z] );
21
                                 
22
        }
23

24
          syslog ( LOG_INFO, "debug:%d", fd_gpio[0] );
25
          syslog ( LOG_INFO, "debug:%d", fd_gpio[1] );
26
          syslog ( LOG_INFO, "debug:%d", fd_gpio[2] );

...
#2933816
Lesenswert?

Danke Dennis für den Input!

Es läuft :-)

1
    // S0 starts here!
2
    char buffer[BUF_LEN];
3
    char vzuuid[36];
4
    int inputs = 6;
5
    struct pollfd fds[inputs];
6
    char gpio_pin_id[][6] = {"17", "18", "21", "22", "23", "24"};
7
    int i;
8
    
9
      for (i=0; i<inputs; i++) 
10
      {
11
        char buffer[BUF_LEN];
12
        snprintf ( buffer, BUF_LEN, "/sys/class/gpio/gpio%s/value", gpio_pin_id[i] );
13
        
14
        if((fds[i].fd = open( buffer, O_RDONLY )) ==-1)
15
        {
16
          syslog(LOG_INFO,"Error:%s (%m)", buffer);
17
        }
18
      }
19
    
20
      for (i=0; i<inputs; i++) 
21
      {
22
        fds[i].events = POLLPRI;
23
      }
24
        
25
      while(1) 
26
      {
27
        int ret = poll(fds, inputs, -1 );
28
            
29
          if(ret<0) 
30
          {
31
            syslog(LOG_INFO,"Error: poll(fds, inputs, -1 )");
32
          }
33
        
34
        for (i=0; i<inputs; i++) 
35
        {
36
          if (fds[i].revents & POLLPRI)
37
          {
38
            int in = read(fds[i].fd, buffer, BUF_LEN);
39
          
40
            sprintf(vzuuid, "%d", fds[i].fd);
41
            http_post(vzuuid);
42
          }
43
        }
44
      }

.
Persönliche Seite #2933894
Lesenswert?

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;
#2933923
Lesenswert?

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?
#2933927
Lesenswert?

Klappt alles wunderbar! Je nach Taste haut er schöne HTTP_POSTs raus :-)

1
127.0.0.1 - - [26/Nov/2012:21:32:57 +0000] "POST /middleware.php/data/3.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
2
127.0.0.1 - - [26/Nov/2012:21:32:58 +0000] "POST /middleware.php/data/3.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
3
127.0.0.1 - - [26/Nov/2012:21:32:58 +0000] "POST /middleware.php/data/3.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
4
127.0.0.1 - - [26/Nov/2012:21:32:58 +0000] "POST /middleware.php/data/3.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
5

6

7

8
127.0.0.1 - - [26/Nov/2012:21:33:00 +0000] "POST /middleware.php/data/1.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
9
127.0.0.1 - - [26/Nov/2012:21:33:01 +0000] "POST /middleware.php/data/1.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
10
127.0.0.1 - - [26/Nov/2012:21:33:01 +0000] "POST /middleware.php/data/1.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
11
127.0.0.1 - - [26/Nov/2012:21:33:01 +0000] "POST /middleware.php/data/1.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
12
127.0.0.1 - - [26/Nov/2012:21:33:01 +0000] "POST /middleware.php/data/1.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
13

14

15

16
127.0.0.1 - - [26/Nov/2012:21:33:05 +0000] "POST /middleware.php/data/2.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
17
127.0.0.1 - - [26/Nov/2012:21:33:06 +0000] "POST /middleware.php/data/2.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
18
127.0.0.1 - - [26/Nov/2012:21:33:06 +0000] "POST /middleware.php/data/2.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
19
127.0.0.1 - - [26/Nov/2012:21:33:06 +0000] "POST /middleware.php/data/2.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
20
127.0.0.1 - - [26/Nov/2012:21:33:06 +0000] "POST /middleware.php/data/2.json HTTP/1.1" 400 284 "-" "s0vz 0.2"
#2933958
Lesenswert?

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

1
    // S0 starts here!
2
    char buffer[BUF_LEN];
3
    char vzuuid[36];
4
    //char gpio_pin_id[][3] = {"17", "18", "21", "22", "23", "24"};
5
    char gpio_pin_id[] = { 17, 18, 21, 22, 23, 24 };
6
    int inputs = sizeof(gpio_pin_id)/3;
7
                struct pollfd fds[inputs];
8
    int i;
9
    
10
      for (i=0; i<inputs; i++) 
11
      {
12
        char buffer[BUF_LEN];
13
        //snprintf ( buffer, BUF_LEN, "/sys/class/gpio/gpio%s/value", gpio_pin_id[i] );
14
        snprintf ( buffer, BUF_LEN, "/sys/class/gpio/gpio%d/value", gpio_pin_id[i] );
15
  
16
        syslog(LOG_INFO,"%s", buffer);
17
        
18
        if((fds[i].fd = open( buffer, O_RDONLY )) ==-1)
19
        {
20
          syslog(LOG_INFO,"Error:%s (%m)", buffer);
21
        }
22
      }
#2933972
Lesenswert?

Ok, gekauft ... :-D

1
    //char gpio_pin_id[][3] = {"17", "18", "21", "22", "23", "24"};
2
    // 13 Chars weniger!
3
    char gpio_pin_id[] = { 17, 18, 21, 22, 23, 24 };
4
    
5
    //int inputs = sizeof(gpio_pin_id)/3;
6
    //int inputs = sizeof(gpio_pin_id)/sizeof(gpio_pin_id[0]);
7
    // 11 Chars mehr!
8
    int inputs = sizeof(gpio_pin_id)/sizeof(char);
#2933985
Lesenswert?

Henrik Wellschmidt schrieb:
> Ok, gekauft ... :-D

Fein.  :)

Noch ein Hinweis:
1
  // 13 Chars weniger!
2
  // 11 Chars mehr!

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:
1
char i,b[BUF_LEN];char gpid[]={17,18,21,22,23,24};
2
struct pollfd fds[6];
3
for(i=0;i<6;i++){
4
snprintf(b,BUF_LEN,"/sys/class/gpio/gpio%d/value",gpid[i]);
5
syslog(LOG_INFO,"%s",b);
6
if((fds[i].fd=open(b,O_RDONLY))<0){
7
syslog(LOG_INFO,"Error:%s (%m)",b);}}

Viele Grüße,
        Simon

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