Forum: Mikrocontroller und Digitale Elektronik RaspberryPI GPIOs via poll()


von Welle 🧐 S. (w3llschmidt)


Angehängte Dateien:

Lesenswert?

Hallo Gemeinde,

ich rätsel schon seit Tagen an einem Problem.

RaspberryPI GPIOs via poll() auf "/sys/class/gpio/gpio%d/value" ...

Funktioniert eigentlich perferkt, bis auf diese blöden Spitzen :-/

Der Interrupt wird von einem Reed ausgelöst, ich dachte erst der prellt, 
aber zwischen den Impulsen liegen regelmässig 5-6 Sekunden!

Hat jemand eine Idee?

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

von PittyJ (Gast)


Lesenswert?

inputs ist zu klein. sollte mindestens 2n+1 sein.

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

PittyJ schrieb:
> inputs ist zu klein. sollte mindestens 2n+1 sein.

Hi Pitty,

1
char gpio_pin_id[] = { 17, 18, 27, 22, 23, 24 };
2
int inputs = sizeof(gpio_pin_id)/sizeof(gpio_pin_id[0]);

'inputs' ist eigentlich nur die Anzahl der GPIO Eingänge ...


Du meinst hier -> int ret = poll(fds, inputs, 0 );

"(Input) nfds is the number of pollfd structures in the fds array."

von PittyJ (Gast)


Lesenswert?

Ach, da gibt es noch wichtige Teile vom Code, die noch nicht gepostet 
wurden. Das kann ich dann ja auch nicht wissen.
Also habe ich mich geirrt.
Aber gelbe Linie auf weissem Grund izt auch schwer zu erkennen.

von Juergen G. (jup)


Lesenswert?

@PittyJ

Die Linien sind Erdgas, sei froh das sie ueberhaupt sichtbar sind auf 
weissem Grund.

;-)

von Welle 🧐 S. (w3llschmidt)


Angehängte Dateien:

Lesenswert?

Ja, gelb ist in der Tat ungünstig ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.