-
        

Ergebnis 1 bis 6 von 6

Thema: Asuro Fersteuern, Problem mit SerRead

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.11.2008
    Beiträge
    12

    Asuro Fersteuern, Problem mit SerRead

    Anzeige

    Hallo,

    ich habe mein Asuro erfolgreich auf Bluetooth umgebaut, habe nun ein Programm geschrieben mit er sich über Bluetooth fernsteuern lässt. Dieses funktioniert auch ohne Problem , allerdings hat es eine Schönheitsfehler.

    Wenn ich eine Taste drücke, dann fährt er so lange in die selbe Richtung, bis ich eine andere Taste drücke oder "q" um zu stoppen. Ich möchte allerdings, dass er so lange fährt wie man die Taste gedrückt, und sobald man sie los lässt soll er anhalten.

    Hab schon versucht nach jeder if-Bedingung den Speicher "empfangen" wieder auf 0 zu setzen "empfangen [0] = 0;". Allerdings ändert das nichts.
    Hat jemand eine Idee wie ich das machen kann?

    Code:
    #include "asuro.h"
    
    int main(void)
    {
    	unsigned char empfangen[0]="000";
    
    	Init();
    		/* Menü Anzeige */
      		{
      		SerPrint("\n\r");
    		SerPrint("Fernsteruerung:\n\r");
    		SerPrint("[w] => Geradeaus fahren\n\r");
    		SerPrint("[s] => Rueckwaerts fahren\n\r");
    		SerPrint("[a] => Linkskurfe\n\r");
    		SerPrint("[d] => Rechtskurfe\n\r");
    		SerPrint("[q] => Stopp\n\r");
    		}
    
    		while(1)
    		{
    			SerRead(empfangen, 1, 2);		//1 Zeichen über UART  einlesen, TimeOut 2ms
    
    			if (empfangen [0] == 'w')		//Geradeaus fahren
    				{
    				MotorSpeed(205,200);
    				MotorDir(FWD,FWD);
    				}
    
    			if (empfangen [0] == 's')		//Rückwärts fahren
    				{
    				MotorSpeed(130,120);
    				MotorDir(RWD,RWD);
    				}
    
    			if (empfangen [0] == 'a')		//Linkskurfe
    				{
    				MotorSpeed(100,185);
    				MotorDir(FWD,FWD);
    				}
    
    			if (empfangen [0] == 'd')		//Rechtskurfe
    				{
    				MotorSpeed(190,100);
    				MotorDir(FWD,FWD);
    				}
    		
    			if (empfangen [0] == 'q')		//Stopp
    				{
    				MotorDir(BREAK,BREAK);
    				}
    
    			
    		}
    	return 0;
    }
    Vielen Dank für eure Hilfe!

    Gruß Schleicha

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    25
    Beiträge
    384
    Hi,

    probiers mal so

    Code:
    #include "asuro.h"
    
    int main(void)
    {
       unsigned char empfangen[0]="000";
    
       Init();
          /* Menü Anzeige */
            {
            SerPrint("\n\r");
          SerPrint("Fernsteruerung:\n\r");
          SerPrint("[w] => Geradeaus fahren\n\r");
          SerPrint("[s] => Rueckwaerts fahren\n\r");
          SerPrint("[a] => Linkskurfe\n\r");
          SerPrint("[d] => Rechtskurfe\n\r");
          SerPrint("[q] => Stopp\n\r");
          }
    
          while(1)
          {
             SerRead(empfangen, 1, 2);      //1 Zeichen über UART  einlesen, TimeOut 2ms
    
             if (empfangen [0] == 'w')      //Geradeaus fahren
                {
                MotorSpeed(205,200);
                MotorDir(FWD,FWD);
                }
    
            else if (empfangen [0] == 's')      //Rückwärts fahren
                {
                MotorSpeed(130,120);
                MotorDir(RWD,RWD);
                }
    
           else  if (empfangen [0] == 'a')      //Linkskurfe
                {
                MotorSpeed(100,185);
                MotorDir(FWD,FWD);
                }
    
           else  if (empfangen [0] == 'd')      //Rechtskurfe
                {
                MotorSpeed(190,100);
                MotorDir(FWD,FWD);
                }
          
           else  if (empfangen [0] == 'q')      //Stopp
                {
                MotorDir(BREAK,BREAK);
                }
          else
    
                {
                MotorDir(BREAK,BREAK);
                }
    
             
          }
       return 0;
    }

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    10.11.2008
    Beiträge
    12
    Geht leider nicht!
    Sobald ich die letzte else-Bedingung einfüge, ignoriert er alles andere und führt immer die else-Bedingung aus .
    Noch ne andere Idee?

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    25
    Beiträge
    384
    Hmm weißt du denn was der Asuro empfängt, wenn du keine Taste drückst? Ich find es merkwürdig, dass er nur die else ausführt.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    05.12.2008
    Beiträge
    5
    du hast im serRead einen fehler:
    wenn serRead innerhalb der timeout=2 (das sind nicht ms sondern schleifendurchläufe) nichts empfängt, dann wird empfangen automatisch ein 'T' eingetragen, und so schnell kannst du gar nicht senden dass ständig etwas ankommt
    also machs am besten im blocking mode, das heißt als timeout 0 übergeben, dann wartet SerRead solange bis etwas ankommtd und wertet dann dieses zeichen aus

    schau dir am besten die ausprogrammierte serRead() funktion an!

  6. #6
    Wenn du zwischen Drücken und Loslassen der Taste unterscheiden willst, geht das nicht in einem Terminal-Modus. Da brauchst du ein Programm, das die Ereignisse KeyDown und KeyUp unterschiedlich behandeln kann, dann könntest du ein Start- und ein Abbruch-Zeichen senden, oder das Befehlszeichen in einer Schleife. Hyperterm oder so sendet einfach immer ein Zeichen pro Tastendruck.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •