2017-06-26 2 views
0

Ich versuche, ein Programm in Raspberry Pi zu erstellen. Dieses Programm ist in C Sprache. Im Projekt habe ich zwei LEDs. Der erste für "EV1" und der zweite für einen Pomp "P1". Wenn ich in der Konsole das Zeichen "S" anklicke, startet das Projekt mit EV1. Wenn ich in die Konsole "g" klicke, startet der EV1 und der Pomp startet für 60s. Wenn man in den 60ern den "C" -Char in die Konsole einbaut, funktioniert der Pomp auch nach den 60ern ohne Stoppen; Andernfalls, wenn Sie kein Zeichen in der Konsole oder etwas anderes als "C" setzen, funktioniert die Pomp nicht weiter und stoppt nach 60s.Verwenden von Uhr in C in Raspberry

Das Problem ist, wenn ich in meinem Code setzen die print() und die scanf() Argumente, wartet die Konsole immer noch für den Benutzer in einem char eingeben, damit der Pomp funktioniert, nachdem ich ein Zeichen setzen und in meinem Fall muss ich den Pomp Arbeits so dass ich gleichzeitig einen char einfügen kann.

Also das ist mein Code:

#include <stdio.h> 
#include <bcm2835.h> 
#include <string.h> 

#define FAN 16 
#define P1 17 
#define P2 27 
#define GPP 22 
#define GPN 20 
#define EV1 21 
#define EV2 13 
#define LAN 19 

void LampOn(int a) 
{ 
     bcm2835_gpio_set(a);  
} 

void LampDel(int a,int b) 
{ 
    unsigned int del=1000; 

    bcm2835_gpio_set(a); 
    bcm2835_delay(del * b); 
    bcm2835_gpio_clr(a); 
}  

void LampOff(int a) 
{ 
    bcm2835_gpio_clr(a); 
} 

void OUTPUT(int c) 
{ 
    bcm2835_gpio_fsel(c, BCM2835_GPIO_FSEL_OUTP); 
} 

char Taper() 
{ 
    char v; 
    printf("put a char: "); 
    scanf("%c",&v); 
    return v; 
} 

int main(int argc, char **argv) 
{ 
    if(!bcm2835_init()) 
    return 1; 

    OUTPUT(17); 
    OUTPUT(27); 
    OUTPUT(22); 
    OUTPUT(13); 
    OUTPUT(19); 
    OUTPUT(20); 
    OUTPUT(21); 
    OUTPUT(16); 
    LampOff(EV1); 

    do 
    { 
     Taper(); 
    }while(Taper()!='s'); 

    while(1) 
    { 
     LampOn(EV1); 
     Taper(); 

     if(Taper()=='g') 
     { 

      LampOff(EV1); 
      LampDel(P1,60); 
     } 
    } 

    while(1) 
    { 
     /* Infinite loop */ 
    } 
} 

Ich denke, einen Zähler hinzuzufügen, aber das ist immer noch eine schlechte Lösung, denn wenn ich einen Zähler verwenden, stoppt das Programm, bis der Zähler stoppt.

Wie kann ich diese Probleme lösen?

+0

Ich habe ehrlich gesagt keine Ahnung, wovon Sie sprechen ... Bitte fügen Sie einige Erläuterungen hinzu. – ForceBru

+0

Willkommen bei SO. Dies ist eine Frage und Antwort Website, also was ist Ihre Frage? –

+0

Was ist ein "Pomp"? Im Englischen ist es ein Adjektiv ("Pomp and Circumstance March" von Elgar, z. B.), und das gilt hier nicht, wo Sie es als Substantiv verwenden. Bitte überprüfen Sie die Übersetzung von Ihrer Sprache ins Englische. –

Antwort

0

Tut mir leid, wenn ich Ihre Frage falsch interpretiert habe.

Grundsätzlich möchte man zwei Dinge gleichzeitig zu tun (gleichzeitig):

  1. Kontroll-LEDs
  2. Warten auf Interaktion mit dem Benutzer über Scanf

Ich würde sagen, es gibt zwei Möglichkeiten, entweder Trennen Sie Ihre Benutzeroberfläche (scanf) in einen separaten Thread oder arbeiten Sie mit stdio im nicht blockierenden Modus, anstatt scanf würden Sie lesen.

+0

Hallo tgregory danke für die Antwort, aber wie ich mit stidio in nicht arbeiten kann -Blockierungsmodus? – Sekmani52

+0

@ Sekmani52 werfen Sie einen Blick auf diese [Frage] (https://stackoverflow.com/questions/717572/how-do-you-do-non-blocking-console-io-on-linux-in-c) Alles lesen die Antworten, diejenigen mit O_NONBLOCK wechseln in den nicht blockierenden Modus. Beachten Sie, dass auf diese Weise der Code, der erwartet, dass er sich im blockierenden Modus befindet, unterbrochen wird. – tgregory