Mache dir nochmal Gedanken über die genaue Position der Zeile "c = uart_getc();" innerhalb der while-Schleife. So wie es jetzt ist, wird aus der while-Schleife unweigerlich eine Endlosschleife nach den ersten 1-3 Zeichen.
Hallo,
ich hatte schon vor einigen Tagen hier gepostet, doch muss ich das Posting erstmal zur Seite legen. Zunächst einmal habe ich folgendes Problem.
Ich möchte mit der Library von Peter Fleury einen String auf eine ATMega128 schicken und einmal als Echo zurückbekommen. Abgeschlossen werden soll der String mit '#'. Doch irgendwie funktioniert das alles nicht so, wie ich möchte. Könnte mir bitte jemand helfen.
Danke und Gruß,
Matze
Code:#include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <avr/pgmspace.h> #include <util/delay.h> #include "uart.h" /* define CPU frequency in Mhz here if not defined in Makefile */ #ifndef F_CPU #define F_CPU 14745600UL #endif #define UART_BAUD_RATE 9600 int main() { char Eingabe[10]; unsigned int Count; unsigned int c; uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); sei(); for(;;)//ever { c = uart_getc(); if ( !(c & UART_NO_DATA )) //es gibt Daten { Count = 0; while ( (char) c != '#' ) { if (Count < 10 && (! (c & UART_NO_DATA) ) ) { Eingabe[Count++] = (char) c; c = uart_getc(); } } Eingabe[Count] = '\0'; //Sequenz von Zeichen in einen String } uart_puts( "\nEmpfangen: \"" ); uart_puts( Eingabe ); uart_puts( "\"" ); } //for(;;)-Ende } //main-Ende
Mache dir nochmal Gedanken über die genaue Position der Zeile "c = uart_getc();" innerhalb der while-Schleife. So wie es jetzt ist, wird aus der while-Schleife unweigerlich eine Endlosschleife nach den ersten 1-3 Zeichen.
MfG
Stefan
Oh, ja, danke. Habe es geändert. Jetzt klappt es.
Durch eine Erweiterung nun ein weiteres Problem.
Wenn über die Schnitstelle (hTerm) eine 10 bzw. 35 gesendet wird, soll der µC etwas machen, was aber bisher nicht klappt. Ich glaube, dass das an den Konvertierungen char<->integer liegen könnte, doch komme ich selber nicht weiter und brauche nochmal eure Unterstützung. Danke
Code:#include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <avr/pgmspace.h> #include <util/delay.h> /* define CPU frequency in Mhz here if not defined in Makefile */ #ifndef F_CPU #define F_CPU 14745600UL #endif #define UART_BAUD_RATE 9600 int main() { char Eingabe[100]; unsigned int Count; unsigned int c; unsigned int Word; uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); sei(); for(;;)//ever { c = uart_getc(); if ( !(c & UART_NO_DATA )) //es gibt Daten { Count = 0; while ( (char) c != '\r' ) //Bis RETURN { if (Count < 100 && (! (c & UART_NO_DATA) ) ) { Eingabe[Count++] = (char) c; } c = uart_getc(); } Eingabe[Count] = '\0'; //Sequenz von Zeichen in einen String uart_puts( " Empfangen: \"" ); uart_puts( Eingabe ); uart_puts( "\"" ); Word = (int) Eingabe; if (Word == 10) { tue etwas } else if (Word == 35) { tue etwas anderes } } } //for(;;)-Ende } //main-Ende
Richtig, denn die Zeile "Word = (int) Eingabe; " ist (sorry) totaler Quatsch. Was du da in "Word" speicherst, ist die Adresse des Strings. Schau dir die Funktion "atoi" an.Ich glaube, dass das an den Konvertierungen char<->integer liegen könnte
MfG
Stefan
Danke. Mit "atoi" klappt es. Wieder etwas dazu gelernt.
Lesezeichen