Gast
#1220081
Hallo Zusammen,
ich versuche mich gerade an einen Interruptgesteuerten Usart. Hierfür
benutze ich einen Atmega644. Ich habe folgendes Problem. wenn ich die
Funktion einlesen_str aufrufe ließt sie 1 Zeichen und hängt sich dannach
auf.(Sie kommt 1 mal bis ausgabe("Test 1\n\n\r") und dannach nichts
mehr)
Funktionsaufruf:
uint8_t buf[15];
while(!daten_verfuegbar() );
einlesen_str(buf, 15);
und hier der Usart Quelltext:
static char buffer_out[BUFFER_SIZE]; // Ringpuffer: Ausgabe
static char buffer_in[BUFFER_SIZE]; // Ringpuffer: Eingabe
static int leser_out = BUFFER_SIZE - 1;
static int leser_in = BUFFER_SIZE - 1;
static int schreiber_out = 0;
static int schreiber_in = 0;
uint8_t einlesen_str(uint8_t *buf, uint8_t n){
uint8_t i = 0;
while(i < n-1) {
if(((leser_in + 1) % BUFFER_SIZE) != schreiber_in)
{
ausgabe("Test 1\n\n\r");
leser_in = (leser_in + 1) % BUFFER_SIZE;
buf[i++] = buffer_in[leser_in];
ausgabeZeichen(buffer_in[leser_in]);
}
if(buffer_in[leser_in] == '\n')
{
ausgabe("Test 2\n\n\r");
break;
}
}
buf[i] = '\0';
return i+1;
}
uint8_t daten_verfuegbar (void)
{
if( ( (leser_in + 1) % BUFFER_SIZE) != schreiber_in){
return 1;
}
return 0;
}
ISR(USART0_RX_vect)
{
if(((schreiber_in + 1) % BUFFER_SIZE) != leser_in) {
buffer_in[schreiber_in] = UDR0;
schreiber_in = (schreiber_in + 1) % BUFFER_SIZE;
}
}
Ansonsten wird nirgendwo auf die Variablen zugegriffen. Bin für jede
Hilfe Dankbar
Gruß
Alex