Помогите понять в чем проблема, гугл не помог, может не там копал. Ситуация следующая:
Есть код.
Описание кода в краце:
Микроконтроллер настроен и работает на частоте 8МГц. Инициализируем 10 переменных ch_1_1...ch_2_5, инициализируем переменную буфера передачи данных макс 6 байт (1 байт команды и 5 байт параметров), инициализируем UART (9600, 8 бит 2 стоп бита), разрешаем прерывания по RX.
Сидим ждем прихода пакета. Пакет должен начинаться с < и заканчиваться >(эти символы не учитываются в пакете), кол-во данных в пакете не должно превышать максимального размера буфера, а так же первый байт пакета должен быть 1 или 2, в противном случае данные по UART игнорируются. При входе подходящего нам пакета, например
<123456>, принимаем его, загоняем в буффер значения ={1,2,3,4,5,6}. Так как первый байт буфера 1, то остальные байты буфера присваиваем переменным ch_1_1...ch_1_5, После этого значения переменных передаем обратно по UART, в той же последовательности, добавив первым байт команды. То есть должны получить пакет <123456>. В данном случае так и происходит. В спойлере код и скрин из монитора UART, отправленая и принятая команда.
Спойлер
Код: Выделить всё
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
char ch_1_1 = 255;
char ch_1_2 = 0;
char ch_1_3 = 0;
char ch_1_4 = 10;
char ch_1_5 = 10;
char ch_2_1 = 0;
char ch_2_2 = 255;
char ch_2_3 = 0;
char ch_2_4 = 10;
char ch_2_5 = 10;
#define USART_bufferCountMax 6 /*Максимальное значение буфера для обмена по USART*/
int main(void)
{
initialization();
while(1)
{
}
}
void initialization() /*инициализация программы*/
{
USART_Init( 51 );
sei();
}
void USART_Init( unsigned int baud ) /*Инициализация UART*/
{
UBRRH = (unsigned char)(baud>>8); /* Set baud rate */
UBRRL = (unsigned char)baud;
UCSRA &= ~( 1<<U2X); // неудвоенная передача, нам спешить некуда
UCSRC = (1<<USBS)|(3<<UCSZ0); // Режим 8 бит, 2 стоповыx бита
UCSRB |= (1<<RXEN)|(1<<TXEN);
UCSRB |= (1 << RXCIE);
}
char USART_buffer[] = {0}; /*Буффер обмана данными по UART*/
char USART_buffer_count = 0; /*Кол-во данных записаных в буфер в текущей передаче*/
char USART_startReceiveData = 0; /*Флаг сигнализирующий о передаче*/
ISR(USART_RX_vect)
{
char bit = UDR;
if (USART_startReceiveData == 1)
{
if (bit == '>')
{
USART_startReceiveData = 0;
if (USART_buffer[0] == '1')
{
ch_1_1 = USART_buffer[1];
ch_1_2 = USART_buffer[2];
ch_1_3 = USART_buffer[3];
ch_1_4 = USART_buffer[4];
ch_1_5 = USART_buffer[5];
USART_Transmit('<');
USART_Transmit('1');
USART_Transmit(ch_1_1);
USART_Transmit(ch_1_2);
USART_Transmit(ch_1_3);
USART_Transmit(ch_1_4);
USART_Transmit(ch_1_5);
USART_Transmit('>');
}
if (USART_buffer[0] == '2')
{
//ch_2_1 = USART_buffer[1];
ch_2_2 = USART_buffer[2];
//ch_2_3 = USART_buffer[3];
ch_2_4 = USART_buffer[4];
//ch_2_5 = USART_buffer[5];
USART_Transmit('<');
USART_Transmit('2');
//USART_Transmit(ch_2_1);
USART_Transmit(ch_2_2);
//USART_Transmit(ch_2_3);
USART_Transmit(ch_2_4);
//USART_Transmit(ch_2_5);
USART_Transmit('>');
}
}
else
{
if (USART_buffer_count != USART_bufferCountMax)
USART_buffer[USART_buffer_count++] = bit;
else
return;
}
}
if (bit == '<')
{
USART_startReceiveData = 1;
USART_buffer_count = 0;
}
}
void USART_Transmit( unsigned char data ) /*Передача одного символа по UART*/
{
while ( !( UCSRA & (1<<UDRE)) );
UDR = data;
}
Это при том, что в данном случае программа обходит if с раскомментированой строкой. Так как команда которую он получил = 1. То есть отработает if (USART_buffer[0] == '1')
Сам код и скрин:
Спойлер
Код: Выделить всё
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
char ch_1_1 = 255;
char ch_1_2 = 0;
char ch_1_3 = 0;
char ch_1_4 = 10;
char ch_1_5 = 10;
char ch_2_1 = 0;
char ch_2_2 = 255;
char ch_2_3 = 0;
char ch_2_4 = 10;
char ch_2_5 = 10;
#define USART_bufferCountMax 6 /*Максимальное значение буфера для обмена по USART*/
int main(void)
{
initialization();
while(1)
{
}
}
void initialization() /*инициализация программы*/
{
USART_Init( 51 );
sei();
}
void USART_Init( unsigned int baud ) /*Инициализация UART*/
{
UBRRH = (unsigned char)(baud>>8); /* Set baud rate */
UBRRL = (unsigned char)baud;
UCSRA &= ~( 1<<U2X); // неудвоенная передача, нам спешить некуда
UCSRC = (1<<USBS)|(3<<UCSZ0); // Режим 8 бит, 2 стоповыx бита
UCSRB |= (1<<RXEN)|(1<<TXEN);
UCSRB |= (1 << RXCIE);
}
char USART_buffer[] = {0}; /*Буффер обмана данными по UART*/
char USART_buffer_count = 0; /*Кол-во данных записаных в буфер в текущей передаче*/
char USART_startReceiveData = 0; /*Флаг сигнализирующий о передаче*/
ISR(USART_RX_vect)
{
char bit = UDR;
if (USART_startReceiveData == 1)
{
if (bit == '>')
{
USART_startReceiveData = 0;
if (USART_buffer[0] == '1')
{
ch_1_1 = USART_buffer[1];
ch_1_2 = USART_buffer[2];
ch_1_3 = USART_buffer[3];
ch_1_4 = USART_buffer[4];
ch_1_5 = USART_buffer[5];
USART_Transmit('<');
USART_Transmit('1');
USART_Transmit(ch_1_1);
USART_Transmit(ch_1_2);
USART_Transmit(ch_1_3);
USART_Transmit(ch_1_4);
USART_Transmit(ch_1_5);
USART_Transmit('>');
}
if (USART_buffer[0] == '2')
{
//ch_2_1 = USART_buffer[1];
ch_2_2 = USART_buffer[2];
ch_2_3 = USART_buffer[3];
ch_2_4 = USART_buffer[4];
//ch_2_5 = USART_buffer[5];
USART_Transmit('<');
USART_Transmit('2');
//USART_Transmit(ch_2_1);
USART_Transmit(ch_2_2);
//USART_Transmit(ch_2_3);
USART_Transmit(ch_2_4);
//USART_Transmit(ch_2_5);
USART_Transmit('>');
}
}
else
{
if (USART_buffer_count != USART_bufferCountMax)
USART_buffer[USART_buffer_count++] = bit;
else
return;
}
}
if (bit == '<')
{
USART_startReceiveData = 1;
USART_buffer_count = 0;
}
}
void USART_Transmit( unsigned char data ) /*Передача одного символа по UART*/
{
while ( !( UCSRA & (1<<UDRE)) );
UDR = data;
}
Atmel Studio 6 (Version: 6.2.1563 - Service Pack 2) Устанавливал как есть, по умолчанию так сказать.
Помогите понять в чем причина и как с ней бороться.


