PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Array wird nicht richtig ausgelesen



sirhC
19.01.2010, 18:44
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:




#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

p_mork
19.01.2010, 19:42
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

Valen
20.01.2010, 00:43
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.

sirhC
20.01.2010, 20:00
update time!

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



#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

Valen
20.01.2010, 21:33
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.