ANSI C - open() als Schleife

OP #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
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
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]);
OP
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)
OP
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

.
OP
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
    }
OP
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
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
OP
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
          }
OP
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] );

...
OP
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
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;
OP
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?
OP
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"
OP
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
      }
OP
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);
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

Eine eigene Frage? Dieser Thread ist über 13 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.