AVR на C, траблы с UART

Доброго времени суток. Я новичок в программировании, и в МК. Пытаюсь написать прогу, но не совсем то выходит.
Через терминал (например ГиперТерминал) набираю слово, затем жму 'Enter' и он мне должен вернуть это же слово.
С символом все просто, а вот с массивами никак. Он возвращает, но зараза возвращает слово без первого элемента, например, пишу "Privet", а он мне "rivet". Дело в том, что у него в массиве нулевой элемент почему-то r, а не P. Помогите чем можете. Если не в ту тему, то извиняюсь.

Код:

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>
  4. #define XTAL 3686400L //Задал частоту
  5. #define baudrate 9600L //Скорость
  6. #define bauddivider (XTAL/(16*baudrate)-1)
  7.  
  8. unsigned char c[255]; //Создаю функцию, в которой данные UDR переписываются в массив c[] (буфер)
  9. void read ()
  10. {
  11. unsigned char i;
  12. for (i=0;i<255;i++)
  13. {
  14. if (UDR =='\n')
  15. return;
  16. else
  17. while (!(USR&(1<<RXC)));
  18. c[i] = UDR;
  19. }
  20. }
  21.  
  22. void write (char *t) //создаю функцию, в которой из буфера скидываю в UDR на отправку
  23. {
  24. unsigned char i;
  25. for (i=0;i<255;i++)
  26. {
  27. if (t[i]==0)
  28. return;
  29. else
  30. while (!(USR&(1<<UDRE)));
  31. UDR = t[i];
  32. }
  33. }
  34.  
  35. ISR (UART_RX_vect)
  36. {
  37. read ();
  38. write(c);
  39. }
  40.  
  41. int main (void)
  42. {
  43. UCR = 1<<RXEN|1<<TXEN|1<<RXCIE|0<<TXCIE;
  44. UBRR = bauddivider;
  45. sei();
  46. while (1)
  47. {
  48. }
  49. return 0;
  50. }

То есть задача отправить

То есть задача отправить слово, напрмиер из 4х символов и получить Эхо?
У тебя ошибка в программе потому, что я так понял МК зажевывает первый символ, так как его получение вызывает срабатывание прерывания, а потом уже выполняется прием остальных букв и их запись в массив.

Сделай сразу в обработчике прерываний запись в массив, не вынося в отельную программу:

  1. ISR (UART_RX_vect)
  2. {
  3. while (UDR!='\n') //пока принятый символ не является окончанием строки
  4. {
  5. c[i] = UDR; //пишем принятый символ в массив поэлементно
  6. i=i+1; //добавляем к номеру элемента 1-цу
  7. }
  8.  
  9. read (); //как все записали, читам!
  10. }