Hallo
Zeiger sind auch nicht mein Gebiet (was kann ich überhaupt?). Das Ampersand & bedeutet die Speicheradresse der Variablen. Ich hab's nun so gelöst (Vorsicht beim Betrachten!) und kann nun warnungsfrei Übersetzen:
Code:
char message[5], *zeiger_auf_message;
zeiger_auf_message=&message[0]; // oje, so kann ich es fehler- und warnungsfrei
SerWrite(zeiger_auf_message,1); // kompilieren
Zurück zum Problem: Das Hyperterminal sendet nur, wenn man auch [Enter] drückt! Es werden also mindestens zwei Zeichen gesendet. Mein aufgebockter (=Räder berühren nicht den Boden) Clon reagiert nun mit diesem Testcode:
Code:
#include "asuro-probot.h"
#include "asuro-probot.c"
//#include "asuro.h"
//#include "stdlib.h"
void BackLED(char left, char right){}; // Dummi
void SerRead(char *data, unsigned char length,unsigned int timeout)
{
unsigned char i = 0;
unsigned int time = 0;
UCSRB = 0x10; // enable receiver
/* non blocking */
if (timeout != 0) {
while (i < length && time++ < timeout) {
if (UCSRA & 0x80) {
data[i++] = UDR;
time = 0;
}
}
if (time > timeout) data[0] = 'T';
}
/* blocking */
else {
while (i < length) {
if (UCSRA & 0x80)
data[i++] = UDR;
}
}
}
void pause_ms(unsigned int dauer)
{
while(dauer--) Sleep (36); // Sleep(72) bei asuro-CD-Library!
}
int main(void)
{
unsigned int data[2];
char data0[5], data1[5];
char message[5], *zeiger_auf_message;
Init();
SerWrite("Hallo :)\n\n\r", 11);
while( 1 )
{
pause_ms(200); // ohne diese Pause empfängt der asuro seine eigenen Meldungen!
StatusLED(RED);
SerRead(message,2,0); // Warten auf zwei Zeichen: Befehl und Enter?
zeiger_auf_message=&message[0]; // oje, so kann ich es fehler- und warnungsfrei
SerWrite(zeiger_auf_message,1); // kompilieren
SerWrite("\n\r", 2);
StatusLED(YELLOW);
if(message[0] == 'g')
{
FrontLED(ON);
Sleep(10); // Eine LED wird nicht schlagartig hell
LineData(data);
itoa (data[0], data0, 5);
itoa (data[1], data1, 5);
SerWrite (data0, 4);
SerWrite (" links\n\r", 8);
SerWrite (data1, 4);
SerWrite (" rechts\n\r", 9);
pause_ms(2);
MotorDir(FWD,FWD);
MotorSpeed(110,100);
BackLED(OFF,OFF);
if ( data[0] < 50 )
{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(ON,OFF);
pause_ms(120);
} // if
if ( data[1] < 50 )
{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(OFF,ON);
pause_ms(120);
} // if
if (PollSwitch() >= 1)
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
BackLED(OFF,OFF);
StatusLED(RED);
pause_ms(300);
} // if PollSwitch()
} // if(message[0] == 'G')
if(message[0] == 's')
{
MotorDir(FREE,FREE);
FrontLED(OFF); //Dieser Teil müste eigentlich so funktonieren oder
StatusLED(OFF);
} // if(message[0] == 's')
} // while( 1 )
return 0;
} //main(void)
Das ist im wesentliche immer noch das alte Programm, allerdings etwas geputzt. Neu ist pause_ms() für die Wartezeiten. Das ist natürlich noch die Variante für meinen Clon. Man muss im Moment die Befehle mehrmals senden bis er reagiert.
Ungetestet für den orginalen asuro:
Code:
#include "asuro.h"
#include "stdlib.h"
void pause_ms(unsigned int dauer)
{
while(dauer--) Sleep (72);
}
int main(void)
{
unsigned int data[2];
char data0[5], data1[5];
char message[5], *zeiger_auf_message;
Init();
SerWrite("Hallo :)\n\n\r", 11);
while( 1 )
{
pause_ms(200); // ohne diese Pause empfängt der asuro seine eigenen Meldungen!
StatusLED(RED);
SerRead(message,2,0); // Warten auf zwei Zeichen: Befehl und Enter?
zeiger_auf_message=&message[0]; // oje, so kann ich es fehler- und warnungsfrei
SerWrite(zeiger_auf_message,1); // kompilieren
SerWrite("\n\r", 2);
StatusLED(YELLOW);
if(message[0] == 'g')
{
FrontLED(ON);
Sleep(10); // Eine LED wird nicht schlagartig hell
LineData(data);
itoa (data[0], data0, 5);
itoa (data[1], data1, 5);
SerWrite (data0, 4);
SerWrite (" links\n\r", 8);
SerWrite (data1, 4);
SerWrite (" rechts\n\r", 9);
pause_ms(2);
MotorDir(FWD,FWD);
MotorSpeed(110,100);
BackLED(OFF,OFF);
if ( data[0] < 50 )
{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(ON,OFF);
pause_ms(120);
} // if
if ( data[1] < 50 )
{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(OFF,ON);
pause_ms(120);
} // if
if (PollSwitch() >= 1)
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
BackLED(OFF,OFF);
StatusLED(RED);
pause_ms(300);
} // if PollSwitch()
} // if(message[0] == 'G')
if(message[0] == 's')
{
MotorDir(FREE,FREE);
FrontLED(OFF); //Dieser Teil müste eigentlich so funktonieren oder
StatusLED(OFF);
} // if(message[0] == 's')
} // while( 1 )
return 0;
} //main(void)
Gruß
mic
Lesezeichen