Problem USART Interrupt routine

Gast #5032189
Lesenswert?

hallo,
Das Problem ist jener, dass er mir bei INterrupt USART RXC wenn ich im 
Hauptprogramm dann einen String ausgeben möchte nur 2 Zeichen ausgibt 
von dem String.

Ich steh da an:
/*
 * C2T3_v1.c
 *
 * Created: 28.05.2017 16:13:26
 * Author : Gert
 */

#include <avr/io.h>
#include <avr/io.h>
#include <stdlib.h>
#include <string.h>
#include <avr/interrupt.h>
#include <util/setbaud.h>
#include <util/delay.h>


#define FOSC 16000000
#define MYUBRR 51



void uart_init(void)
{
 cli();
   //1 = output, 0 = input
   // DDRB = 0b11101111; //PB4 = MISO
   // DDRC = 0b11111110; //
   DDRD = 0b11111110; //PORTD (RX on PD0)

   //USART Baud rate: 56700
   UBRR0H = (MYUBRR >> 8);
   UBRR0L = MYUBRR;
   UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
   /* Set frame format: 8data, 2stop bit */
   UCSR0C = (0<<USBS0)|(3<<UCSZ00);
   UCSR0A = (1<<U2X0);

  // stdout = &mystdout; //Required for printf init

  //  UCSR0B |= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);  // UART RX, TX und 
RX Interrupt einschalten
  sei();


}

int uart_putc(unsigned char c)
{
   if(UCSR0A & (1<<UDRE0))         /* Senden, wenn UDR frei ist 
*/
   {    UDR0 = c;               /* schreibt das Zeichen x auf die 
Schnittstelle */
   }                    /* sende Zeichen */
  return 0;
}


void uart_puts (char *s)
{
  while (*s)
  {   /* so lange *s != '\0' also ungleich dem 
"String-Endezeichen(Terminator)" */
    uart_putc(*s);
    s++;
  }
}


#define UART_MAXSTRLEN 40

volatile uint8_t uart_str_complete = 0;     // 1 .. String komplett 
empfangen
volatile uint8_t uart_str_count = 0;
volatile char uart_string[UART_MAXSTRLEN + 1] = "";
void USART_Flush( void )
{
  unsigned char dummy;
  while ( UCSR0A & (1<<RXC0) ) dummy = UDR0;
}
ISR(USART0_RX_vect)
{   //PB0 im PORTB setzen

  unsigned char nextChar;

  // Daten aus dem Puffer lesen
  nextChar = UDR0;
  if( uart_str_complete == 0 ) {  // wenn uart_string gerade in 
Verwendung, neues Zeichen verwerfen
    PORTD |= (1 << PORTD3);
    // Daten werden erst in uart_string geschrieben, wenn nicht 
String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
    if( nextChar != '\n' &&
    nextChar != '\r' &&
    uart_str_count < UART_MAXSTRLEN ) {
      uart_string[uart_str_count] = nextChar;
      uart_str_count++;
    }
    else {
      PORTD &= ~(1 << PORTD3); //PB0 im PORTB löschen
      uart_string[uart_str_count] = '\0';
      uart_str_count = 0;
      uart_str_complete = 1;
    }
  }
}



int main(void)
{
char char_array[] = { "Hallo Programm gestartet" };
// Pufferspeicher ausreichend groß
// evtl. Vorzeichen + width + Endezeichen:
//char s[8];
float f = -12.345;
// int16_t i = -12345;

uart_init();
PORTD |= (1 << PORTD3);
_delay_ms(5000);
PORTD &= ~(1 << PORTD3); //PB0 im PORTB löschen




    while (1)
    {



  if(uart_str_complete)
  {
  USART_Flush();
  uart_puts(uart_string);
  uart_str_complete = 0;
  }





  }
  return 0;
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren