Код: Выделить всё
volatile unsigned char cRx = 0;
volatile unsigned char cnt = 0;
#define bytes 21
volatile unsigned char RecendMas[bytes];//<<<< полученная строка
// Процедура инициализации USART
void usart_ini()
{
//установка двойной скорости
UCSR0A = ( 1<<U2X); //Устанавливаем удвоение скорости
//прерывание по приёму данных
UCSR0B=(1<<RXCIE)|(1<<RXEN)|(1<<TXCIE)|(1<<TXEN); //разр. прерыв при приеме, разр приема, разр передачи.
//Размер кадра данных 8 бит
UCSR0C |= (1<<7) | (1<<1) | (1<<2);
//Запись в UBRRH
UBRR0H = 0x00;
// Скорость обмена (19200)
UBRR0L = 26;
}
ISR(USART0_RX_vect) //USART_RXC_vect, прием завершен для Atmega128
{
if ((cnt == 0) || (RecendMas[0] == '<')) //Заполнить буффер если это первый символ и он равен "<"
{
RecendMas[cnt] = UDR0;
cnt++;
}
else
{
cRx = 0;
cnt = 0;
}
if ((cnt == bytes) && (RecendMas[0] == '<') && (RecendMas[20] == '>')){ //<<<<<< Если принят 1 байт и первым стоит байт "<", то...
cRx = 1;
}
}
//-----------------------------
// Функция передачи символа в порт
unsigned char queueC, sendC;
unsigned char queue[21];
ISR(USART0_TX_vect)
{
if(queueC != sendC)
UDR0 = queue[sendC++];
_delay_loop_2(200);
}
//-----------------------------
void SendStr(char *data)
{
queueC = 0;
sendC = 1;
while (*data) queue[queueC++] = *data++;
if ((UCSR0A & (1<<UDRE)) != 0) {
UDR0 = queue[0];
}
}
int main(void)
{
usart_ini();
//
..
тут у меня настройка портов ввода вывода
..
//
sei();//устанавливаем бит глобального разрешения прерываний
while(1)//Бесконечный цикл
{
if (cRx) //Если при получении нет ошибок, отправить данные
SendStr("<36027030011000-1800>"); //отправка данных "<>" означают начало и конец строки
}
}


