PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART mit Fleury Library



MT2009
18.06.2010, 20:39
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



#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

sternst
18.06.2010, 23:10
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.

MT2009
19.06.2010, 21:51
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



#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

sternst
20.06.2010, 06:35
Ich glaube, dass das an den Konvertierungen char<->integer liegen könnteRichtig, 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.

MT2009
20.06.2010, 17:20
Danke. Mit "atoi" klappt es. Wieder etwas dazu gelernt.