PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro Fersteuern, Problem mit SerRead



schleicha
07.12.2008, 18:05
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?



#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

sloti
07.12.2008, 19:01
Hi,

probiers mal so



#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;
}

schleicha
07.12.2008, 22:02
Geht leider nicht!
Sobald ich die letzte else-Bedingung einfüge, ignoriert er alles andere und führt immer die else-Bedingung aus :-s .
Noch ne andere Idee?

sloti
08.12.2008, 10:36
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.

accControl
08.12.2008, 13:42
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!

ruebenhaupt
22.01.2009, 21:46
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.