Witam. 
Po lekturze tego tematu i ja chciałem coś tu dodać. A oto mój sposób na odbieranie string'ów :
w bibliotece MKUART w pliku mkuart.h pod definicjami (#define...) ,a przed deklaracjami funkcji - dodałem taki wpis:
Kod:
extern volatile uint8_t flag; // TO JEST MOJE !!
w bibliotece MKUART w pliku mkuart.c pod definicjami zmiennych - dodałem taki wpis:
Kod:
volatile uint8_t flag; // TO JEST MOJE !!!
	w bibliotece MKUART w pliku mkuart.c w definicji procedury obsługi przerwania odbiorczego ISR( USART_RXC_vect ) tuż za linijką z instrukcją " data = UDR; //pobieramy natychmiast bajt danych z bufora sprzętowego ", a przed linijką z instrukcją "  tmp_head = ( UART_RxHead + 1) & UART_RX_BUF_MASK; " - dodałem taki wpis:
Kod:
if(data == '\r') flag++; // TO JEST MOJE !!!
	w moim programie w pliku  main.c  a przed funkcją " int main (void) {...} " - dodałem taki wpis:
Kod:
char tablica[17];   // bufor znakow ASCII z odczytu (taki jest bufor w funkcji "void uart_putint(int value, int radix)" biblioteki mkuart.c)
uint8_t i;    //  ilość wszystkich znaków odczytanych 
char c;   // odczytany znak
	w moim programie w pliku  main.c  w funkcji " int main (void) {...} " w pętli głównej " while(1) {...} " - dodałem taki wpis:        
Kod:
if(flag) // jeżeli są odebrane dane w buforze to...
   {
      i =0;   // zerowanie licznika i
      while ((c = uart_getc()) != '\r')   // sprawdza czy koniec string'a (czy jest enter -> 0x0D)
      {
         if((i <= 17) && (c != '\n'))   // uwaga!... max. ilość znaków w string'u to 16
         {
            tablica[i] =c;   // zapis znaku do wybranej komórki w tablicy
            i++; // następna komórka w tablicy
            tablica[i] ='\0';   // ostatni znak w łańcuchu
         }//end if()...                     
      }//end while()...   
      flag--; // flaga końca odbioru danych z uart         
   }//end  if(flag)...
Chciałbym stworzyć funkcję, gdzie cały łańcuch	typu string odebrany z mojego laptopa miałbym w tablicy o nazwie " tablica ", i tu moje pytanie czy taka funkcja napisana poniżej była by poprawna?. 
Kod:
#define ROZMIAR 16  // rozmiar odebranych znaków wynika z bufora znaków wysłanych na port szeregowy w funkcji "void uart_putint(int value, int radix)" biblioteki mkuart.c
uint8_t tab[ROZMIAR];   // bufor tekstu 
uint8_t tablica[ sizeof(tab) +1 ];  // bufor na tekst plus znak '\0'(znak końca łańcucha)
// procedura pobiera z PC łańcuch typu "String" 
void PC_Text(uint8_t *tablica)   // ilość znaków w łańcuchu (minimum 1)(maximum 16)
{
    char c;         // odczytany znak
    while ((c = uart_getc()) != '\r')   // sprawdza czy koniec string'a (czy jest enter -> 0x0D)
   {
      if((sizeof(tablica++) <= ROZMIAR) && (c != '\n'))   // uwaga!... ta linijka ma pozwolić wpisać do tablicy max. 16 znaków
      {
         *tablica++ = c;   // zapis znaku do wybranej komórki w tablicy
      }//end if()...                     
   }//end while()...
   *tablica++ ='\0';   // ostatni znak w łańcuchu
}//koniec ---------------------------------------
Wdzięczny będę za każdą uwagę i ewentualne poprawienie mojej funkcji.
  Piotr