-         

Ergebnis 1 bis 5 von 5

Thema: Array wird nicht richtig ausgelesen

  1. #1

    Array wird nicht richtig ausgelesen

    Anzeige

    Hallo liebe ASURO-Fangemeinde,

    ich bin noch Neuling in Sachen C-Programmierung und versuche seit heute Mittag um 2 ein Programm zu schreiben, welches Signale vom Infrarottranceiver aufnimmt, die ich per Terminalprogramm(HTerm) vom PC aus losschicke, in ein array abspeichert und - je nachdem was dann da drin steht - darauf reagiert.

    mein Problem ist leider, dass bei mir das array irgendwie nicht richtig ausgelesen wird.

    mein Befehl sieht beispielsweise im dualen folgendermaßen aus:

    1010 0000 0010 0000
    also dezimal eine 40992

    wenn dieser beim ASURO ankommt, soll er vorwärts fahren.

    bis jetzt sieht der Code folgendermaßen aus:


    Code:
    #include "asuro.h"    //habe noch die stadard asuro.h von AREXX
    
    void longsleep(unsigned int dauer)     //Funktion die etwas länger, als ein einfacher "Sleep" Befehl wartet
    {
    	unsigned int i;
    	for(i=0;i<dauer;i++)
    		{
    		Sleep(216);
    		}
    return;
    }
    
    int main(void)
    {		
    		unsigned int command[1];               //Setzen des Arrays "command"
    		Init();
    	
    	while(1)
    	{
    		StatusLED(YELLOW);
    		SerWrite("\n\r Warte auf Kommando.\n\r",24); 
    		MotorDir(BREAK,BREAK);
    		MotorSpeed(0,0);
    		
    		SerRead(command,2,0);                  //Warten auf einen 2 Bytes, also 16 Bit langen Befehl
    		longsleep(50);
    		
    		
    		
    		if(command[0]==40992)         //wenn ASURO 40992 empfängt vorwärts fahren
    		{
    			StatusLED(GREEN);
    			MotorDir(FWD,FWD);
    			MotorSpeed(180,180);
    			longsleep(200);
    			break;
    		}
    		
    		
    	
    		else                                       //ansonsten von vorne anfangen
    			{
    			break;
    			}
    			
    			
    	}
    	
    	return 0;
    	
    }

    sieht jemand irgendwo einen potentiellen Fehler?


    ein kleiner Tip wäre echt klasse


    Gruß
    Chris

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    26
    Beiträge
    522
    Hallo Chris,

    möglicherweise gibst Du die Bytes einfach in der falschen Reihenfolge ein. auf dem AVR ist das erste Byte das untere Byte, das zweite das obere!

    'break' bedeutet übrigens, dass die aktuelle Schleife verlassen wird. Die Schleife von vorne anfangen heißt 'continue'. In Deinem fall wär eigentlich keins von beiden nötig, da die Auswertung von command sowieso der letzte Ausdruck in der Schleife ist, weshalb automatisch zum Schleifenanfang gesprungen wird.

    MfG Mark

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Hmm, wird mit dem break; statement nicht die ganzen while-schleife abgebrochen? Und dammit kommt Asuro bei dem "return 0;" statement an, was er nicht darf.

  4. #4
    update time!

    also, das prog funktioniert jetzt, nur leider is das array nur ein unsigned char... als unsigned interger funzt es immernoch nicht, leider


    Code:
    #include "asuro.h"
    
    void longsleep(unsigned int dauer)
    {
    	unsigned int i;
    	for(i=0;i<dauer;i++)
    		{
    		Sleep(216);
    		}
    return;
    }
    
    int main(void)
    {	
    	unsigned char command[1];
    	Init();
    	
    	while(1)
    	{
    		command[0]=0;
    		StatusLED(YELLOW);
    		SerWrite("\n\r Warte auf Kommando.\n\r",24);
    		MotorDir(BREAK,BREAK);
    		MotorSpeed(0,0);
    		longsleep(50);
    		
    		SerRead(command,1,0);
    		
    		longsleep(50);
    		
    		
    		if(command[0]==32)                                //ein Stück vorwärts fahren
    		{
    			StatusLED(GREEN);
    			MotorDir(FWD,FWD);
    			MotorSpeed(180,180);
    			longsleep(400);
    			continue;
    		}
    		
    		
    		if(command[0]==33)                  //ein Stück rückwärts fahren
    		{
    			BackLED(ON,ON);
    			MotorDir(RWD,RWD);
    			MotorSpeed(180,180);
    			longsleep(400);
    			BackLED(OFF,OFF);
    			continue;
    		}
    		
    		if(command[0]==16)                        //Rechtsdrehung
    		{
    			BackLED(OFF,ON);
    			MotorDir(FWD,FREE);
    			MotorSpeed(150,0);
    			longsleep(400);
    			BackLED(OFF,OFF);
    			continue;
    		}
    		
    		if(command[0]==17)                      //Linksdrehung
    		{
    			BackLED(ON,OFF);
    			MotorDir(FREE,FWD);
    			MotorSpeed(0,150);
    			longsleep(400);
    			BackLED(OFF,OFF);
    			continue;    //die continues musst ich ans ende einer jeden if abfrage setzen, ohne is er irgendwie nicht an den anfang zurückgekehrt
    		}
    		
    		else
    			{
    			continue;
    			}
    			
    			
    	}
    	
    	return 0;
    	
    }


    also, wenn jemand doch noch 'ne Idee hat, das Ding auf größere Befehle auszulegen, Vorschläge sind gern gesehen


    Gruß
    Chris

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Daten werden auch nur als einer reihe von bytes (= char) gesendet. (unsigned) integer sind 2 bytes. Aber dammit dein program richtig funktioniert mussen die bytes in ein bestimmte reihenfolge empfangen werden. Es ist aber möglich das die ersten byte nicht richtig empfangen wird und geht verloren. Dan wird den 2te byte als erste teil der unsigned integer gesehen. Und dan die 1te byte von einer 2te sendung wieder als letzte teil der integer. Deshalb mus dein program ein synchonisation fahigkeit eingebaut habe wenn du commandos ubermitteln möchtest der aus mehrere byte bestehen.

    Dein program benutzt aber nur ein wenig commandos (nur 4 ). Und du kannst noch 250 weitere commandos machen bis du einer 2ter byte benötigd für mehrere commandos.

Berechtigungen

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