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; }
uart_puts(uart_string); hier steht natürlich uart_puts(char_array); sorry
G. schrieb: > Hauptprogramm dann einen String ausgeben möchte nur 2 Zeichen ausgibt > von dem String Ja, weil dein uart_putc einfach alles "entsorgt", wenn UDR gerade belegt ist.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.