Možná by se mohl v přerušení přijmout celý řetězec.
Jako ukončovací znak stringu jsem nastavil Enter kvůli snadnému zkoušení z terminálu.
[code]#include <avr/io.h> //knihovna popisujici MCU
#include <avr/interrupt.h> //knihovna nutna k preruseni
//void u_putc (char data); // pokud je funkce použita až za svou definicí, není prototyp nutný
//void u_puts (char *text);
char buff[20];
volatile uint8_t isr_flag; //použitá v main() i ISR(), proto “volatile”
//-----------------------------------------------------------------------------
void u_putc(char data)
{
while( !(UCSR0A & 1<<UDRE0) ); // pockat na prazdny UDR
UDR0 = data;
}
//-----------------------------------------------------------------------------
unsigned int u_getc(void) //příjem znaku
{
while ( !(UCSR0A & (1<<RXC0)) )
;
return UDR0;
}
//-----------------------------------------------------------------------------
void u_puts(char *s ) //zápis stringu do uart
{
while (*s)
u_putc(*s++);
}
//-----------------------------------------------------------------------------
ISR(USART0_RX_vect)
{
unsigned char index;
for (index=0;index<sizeof(buff);index++)
{
buff[index] = u_getc();
if((buff[index] == 13) || (buff[index] == 10)) //klávesa Enter
{
buff[index] = 0; //ukonči string v "buff" nulou
break; //vystoupí ze smyčky for
}
}
isr_flag=1;
}
//-----------------------------------------------------------------------------
int main(void)
{
// USART0, 8N1, 4800Bd + 0.2% @ 1MHz
UCSR0B |= 1<<TXEN0 | 1<<RXEN0 | 1<<RXCIE0;
// Transmitter Enable, Receiver Enable, RX Complete Interrupt Enable
UBRR0L= 12;
// default nastaveni po resetu je 8N1, nic jiného tedy není třeba nastavovat
sei();
for (;
{
if(isr_flag == 1) // přijat kompletní řetězec nebo plný buffer
{
isr_flag = 0;
u_puts(buff);
}
}
}
[/code]