PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro: SerRead() soll Array füllen....



Illuminon
20.12.2005, 22:53
Hallo Leute

Ich möchte meinen Asuro als Plotter verwenden. Ich kann ihn bereits einfach über Infrarot einen Schritt nach vorn, links oder rechts machen lassen. Dazu sende ich ihm einfach mit einem kleinen DOS Programm die Zahlen 10, 20 oder 30. Das funktioniert.
Nun möchte ich ihm auf einmal ein ganzes Muster senden, so dass der IR Kontakt nicht immer gegeben sein muss. Dazu sende ich zuerst 100, dann weiss er, dass noch mehr kommt. Anschliessend kommt die Anzahl der noch zu empfangen Informationen. Diese sollten immer zuerst die Art des Befehls (vorwärts, links, rechts) sein und anschliessend die Anzahl Schritte in die jeweilige Richtung. Hier ein Beispiel:

100 // Nicht ein Befehl nach dem andern, sondern ein ganzes Muster
4 // Vier Informationen zu erwarten
10 // gerade aus
4 // und zwar vier Schritte
20 // nach links
2 // und zwar 2 Schritte

Diese Infos werden hintereinander gesendet und der Asuro sollte sie in ein Array schreiben. Dazu verwende ich die standart SerRead(), da man meiner Meinung nach für String und Array dasselbe verwenden kann. Die Übergabe mit der Anzahl der Infos funktioniert, die Schleife wird in der richtigen Anzahl durchlaufen, aber ich glaube, dass das Array nur mit Mist gefüllt wird...
Kann mir jemand sagen wo das Problem liegt...



int main(void)
{
char zaehler,c,draw[100];
int x;

Init();


while(1)
{

SerRead(&c,1,0);
switch (c)
{
// check
case 70:
{
SerWrite(70,1);
break;
}

// Fahren
case 10:
{
Forward(1);
break;
}
case 20:
{
Left(1);
break;
}
case 30:
{
Right(1);
break;
}

// Servo
case 40 :
{
chalk(40);
break;
}
case 50:
{
chalk(50);
break;
}
case 60:
{
chalk(60);
break;
}
case 70:
{
//änderungen
}

case 100: // Problemfall !!
{
SerRead(&zaehler,1,0);

SerRead(draw,zaehler,0);

for(x=0;x<zaehler;x++)
{
if (draw[zaehler]==10)
{
Forward(draw[++x]);
}
else if (draw[zaehler]==20)
{
Left(draw[++x]);
}
else if (draw[zaehler]==30)
{
Right(draw[++x]);
}
}
}
}

}
return 0;
}

Forward(x), Left(x) und Right(x) fahren/drehen einfach x Schritte.

Ich bin mir zimlich sicher, dass es etwas dämlisches ist, aber ich habe es vergebens versucht und wäre für jede Hilfe dankbar O:)
Gruss
Illuminon

Rakke
21.12.2005, 10:20
Hei Illuminon,

müsste es nicht heißen:


for(x=0;x<zaehler;x++)
{
if (draw[x]==10)
{
Forward(draw[++x]);
}
else if (draw[x]==20)
{
Left(draw[++x]);
}
else if (draw[x]]==30)
{
Right(draw[++x]);
}
}

Sonst fragst du immer ab, was im ersten char hinter deinem Feld steht.

Gruß Rakke

Illuminon
22.12.2005, 18:00
](*,) ](*,) ](*,) was für ein dämlicher Fehler! Natürlich funktioniert es so....
aber manchmal sieht man vor lauter Bäumen den Wald nicht mehr :-)

Vielen Dank Rakke!