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

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

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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.