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:
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: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
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.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)
Ungetestet für den orginalen asuro:
Gruß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)
mic







Zitieren

Lesezeichen