schleife und tasterturabfrage



  • linux-tux: Formuliere doch bitte zunächst mal eine allgemein verständliche Frage. Dann kannst Du auch eine Antwort erwarten.
    Ich finde es erstaunlich, wie AJ aus Deiner Aneinanderreihung von Wörtern eine sinnvolle Fragestellung produzieren konnte (mir - und vielleicht noch anderen - war das nicht möglich).
    Übrigens gibt es hier eine tolle "Vorschau"-Funktion, mit der man testen kann, ob man seinen eigenen Text versteht.



  • @Krösus
    Meine Vermutungen stützen sich auf den letzten Teilsatz:

    linux-tux schrieb:

    ... und wenn dann die Taste q gedrückt wird soll er aus der schleife gehen!

    😉



  • Es gibt noch die Funktion GetAsyncKeyState(), die ist aber sicher nicht Standard.



  • Stentor schrieb:

    Es gibt noch die Funktion GetAsyncKeyState(), die ist aber sicher nicht Standard.

    ist winapi 😉



  • sorry für die komische ausdrucksweise. ich war im stress.

    so jetzt nochmal schön gesagt.

    ich will über linux das parallel-port leds ansteuern (8 leds). jetzt habe ich das so gemacht, dass wenn ich die taste 1 drücke leuchtet das led 1, taste 2 = led 2 , usw. und dei der taste b blinken alle leds gleichzeitig.
    mein problem ist jetzt das ich nicht ewig lange zeilen schreibe damit die leds blinken siondern nur 2 und die sollen sich wiederholen (schleife (if, while, ....). ich will jetzt wissen wie das geht, wenn ich das mit den tasten einlesen über switch/case mache.
    wie soll ich das machen??

    hier das programm:

    #include <stdio.h>
    #include <string.h>
    #include <sys/io.h>
    #define D_LPT1_DATA		0x378
    
    int main( int argc, char *argv[], int a )
    {
    	int I_port;
    	char *pC_port;
    
    	I_port = D_LPT1_DATA;
    	if ( ioperm( I_port, 3, 1) != 0 ) { /* get IO/perm */
    	  perror( "ann LPT Device nicht öffnen,da es gerade verwendet wird." );
    	  return(-1);
    	}
    	outb( 0x00, I_port );
    	printf( "\nProgramm wurde gestartet. Mit STRG+C wird das Programm beendet\n\nTatse 1 = LED1\nTaste 2 = LED2\nTaste 3 = LED3\nTaste 4 = LED4\nB/b = Alle LEDs blinken\nR/r = Setzt LPT-Port zurück\n\n",
    		pC_port );
    
    	while( 1 )
    	{
    		switch( a = getchar() )
    		{
    			case '1':
    			printf( "Taste '1' aktiviert\n" );
    			outb( 0x1, I_port );
    			break;
    
    			case '2':
    			printf( "Taste '2' aktiviert\n" );
    			outb( 0x2, I_port );
    			break;
    
    			case '3':
    			printf( "Taste '3' aktiviert\n" );
    			outb( 0x4, I_port);
    			break;
    
    			case '4':
    			printf( "Taste '4' aktiviert\n" );
    			outb( 0x8, I_port);
    			break;
    
    			case 'r':
    			case 'R':
    			outb( 0x00, I_port );
    			printf( "LPT-Port wurde zurückgesetzt\n" );
    			break;
    
    			case 'b':
    			case 'B':
    			outb( 0x00, I_port );
    			usleep( 1*200*1000 );
    			printf( "aus\n" );
    			outb( 0xff, I_port );
    			usleep( 1*200*1000 );
    			printf( "ein\n" );
    			break;
    
    			case '\n':
    			break;
    
    			default:
    			printf( "Taste NICHT belegt\n" );
    			outb( 0x00, I_port );
    		}
    
    	}
    
    }
    

    mfg linux-tux



  • Hi
    Naja ne einfache Lösung wär

    //---------- snip ----
    while((a=getchar())!='q'){
       switch(a){
        case 'b':...
        .....
       } 
    }
    //--------- snap -----
    


  • Aber ich seh grad, dass das garnicht mehr die Frage war. Öhm sry.



  • ok danke!naja war nicht die frage aber es hilft mir weiter wenn ich dan die schleife vom blinken beenden will!
    weißt du/jemand wie man das mit der schleife macht??
    kann ich das mit goto machen??und funktioniert das dan auch mit dem while als abfrage ob die taste q ist oder nicht????damit er weiß ob er herausgehen soll aus der schleife oder weiter blinken??

    mfg linux-tux



  • Also, du willst LEDs blinken lassen. Wenn du 1 drückst, soll nur das 1. LED leuchten, wenn 2 dann... usw. Bei b sollen alle LEDs "blinken".
    Sollen die LEDs ständig blinken, solange du nichts anderes drückst? Dann glaub ich weiß ich was du suchst.

    Ansonsten versteh ich immer noch nicht ganz dein Problem. Versuch es mal mit Pseudocode auszudrücken wie es sein soll, vielleicht hilft das mehr.



  • ja genau. bei b sollen alle leds blinken. wenn ich die taste q drücke soll er vom blinken aufhören. alle anderen tasten dürfen das nicht nur mit q soll das blinken beendet werden.

    mfg linux-tux



  • Variante mit kbhit():

    ...
    char z;
    char flag;
    ...
    case 'b':
       for(z=0, flag=0;z!='q';flag=!flag)
       {
          //LED blinken
          outb( (flag)?0xff:0x00 , I_port );
          //Pause damits auch sichtbar ist ;)
          usleep(...);
    
          //Prüfen, ob Benutzer eine Taste gedrückt hat
          if(kbhit())
          {
             //gedrückte Taste holen ohne Echo
             z=getch();
             //restliche Eingaben verwerfen
             while(kbhit())
                getch();
          }
       }
    
       break;
    ...
    

    Das ganze ist aber somit nicht mehr ANSI-C-Standard. Die Funktionen kbhit() und getch() gibts wahrscheinlich in Linux nicht direkt, aber ich habe schon ein paar Threads hier gesehen, die das Problem für Linux behandelt haben und auch Lösungen gekommen sind, wie du kbhit() und getch() in Linux nachbauen kannst. Benutze einfach mal die Suche dazu ;).


Anmelden zum Antworten