Ога, щас попробую разъяснить...
Имеется посылка (ну или какой-то буфер)...
#define LENGHT 42
unsigned char UART1_buf[LENGHT];
... и указатель на него либо просто какая-нибудь переменная, ответственная за текущий отправляемый байт.
unsigned char * UART1_buf_pointer; //указатель на массив
unsigned char UART1_buf_var=0; //просто переменная
Теперь, если пришло время отправить посылочку, то делаем:
//Я обычно в нулевой (первый по счету) элемент записываю количество отправляемых байт, чтоб лишних переменных не заводить.
// либо, если вы используете какой-нибудь протокол типа ModBUS или чего другого то конец посылки можно отслеживать по байту окончания посылки, обычно 0x0D.
UART1_buf[1]=1;
UART1_buf[2]=1;
UART1_buf[3]=1;
UART1_buf[4]=1;
UART1_buf[5]=1;
UART1_buf[6]=1;
UART1_buf[7]=0x0D;
UART1_buf[0]=7; //если ловим 0x0D - то можно 0-ой элемент опустить и начать заполнять данные с нуля.
//инициализируем необходимые переменные
UART1_buf_var=0; //Ну или UART1_buf_pointer = UART1_buf;
//и отправляем первый байт
UDR1=UART1_buf[UART1_buf_var+1]; //Не забываем в нулевом у нас размер посылки или если мы ловим 0x0D - то можно 0-ой элемент опустить
//Всё, ждем прерывания... в смысле продолжаем программу далее
Теперь в прерывании:
if (UART1_buf_var<UART1_buf[0])
{
UART1_buf_var++;
UDR1=UART1_buf[UART1_buf_var+1]; //поскольку изначально UART1_buf_var=0
}
И все. Отправка остановится автоматически, когда UART1_buf_var станет равным UART1_buf[0], т.е. 7 в данном случае (будет отправлено 7 элементов - от 0 до 6).
Если мы работаем с указателями:
if (UART1_buf_pointer!=UART1_buf[UART1_buf[0]]) // проверяем не дошли ли мы до 7-го элемента?
{
UART1_buf_pointer++;
UDR1=*UART1_buf_pointer; //Разыменовывание
}
Вопросы?