Пишу программу для прием и передачи строки для AVR, с передачей не совсем...
т.е. задача такая: нужно принять строку(команду) по UART, сравнить ее с образцом и выдать сообщение...
Для одного символа вроде все подходит, но для строки никак...
Как я понял, что сравнивать полученную строку надо после обработки все прерываний: например у меня 7 символов в строке, соответственно обработчик вызывается 7 раз. Значит нужно переписывать из буфера во временный массив, тогда когда отработают все прерывания по приему ?
после каждого прерывания у меня увеличивается размер буфера и соответственно, что бы флаг ready готовности был равен 1, то нужно в условиях (bufsize > 0) выставить bufsize = 7, а не bufsize > 0 ?
Помогите, плиз, я недавно начал изучать микроконтроллеры. Поэтому для меня многое не понятно...
За ранее благодарен.
- Код: Выделить всё • Развернуть
- #include <avr/io.h>
 #include <avr/interrupt.h>
 #include <string.h>
 #define F_CPU 16000000UL
 #define UART_BAUD 9600 // Скорость USART порта
 void USART_init(void)
 {
 #if F_CPU < 2000000UL && defined(U2X)
 UCSRA = _BV(U2X);
 UBRRL = (F_CPU / (8UL * UART_BAUD)) - 1;
 #else
 UBRRL = (F_CPU / (16UL * UART_BAUD)) - 1;
 #endif
 UCSRB = (1 << TXEN) | (1 << RXEN);
 UCSRB |= (1 << RXCIE);
 sei();
 }
 volatile char buf[200]; // Буфер
 volatile int bufsize = 0; // Длина строки
 volatile char ready = 0; // Получена ли строка?
 ISR(USART_RXC_vect)
 {
 int b;
 b = UDR; // Получаем эти данные
 //if (((b == 13) || (b == 10))
 //&& (bufsize >=6)) ready = 1;
 if((bufsize >=5)) ready = 1;
 if ((b != 13) && (b != 10)
 && (bufsize < sizeof(buf)-1))
 buf[bufsize++] = b;
 //char *p = "X";
 //while (*p){while(!(UCSRA & (1 << UDRE)));UDR = (uint16_t)*p;p++;}
 }
 ISR(USART_TXC_vect)
 {
 //if(ready==1)
 //cli();
 //UDR='J';
 }
 int strcmpP(char *s, char *t)
 {
 for ( ; *s == *t; s++, t++)
 if (*s == '\0')
 return 0;
 return (*s - *t);
 }
 int main(void)
 {
 USART_init();
 char *pCmd = "TEST OK";
 char cmd0[]="ANSWER";
 char *pFail="FAIL";
 char tmp[7];
 char *a=0;
 char *p = "A ?";
 while (*p){while(!(UCSRA & (1 << UDRE)));UDR = (uint16_t)*p;p++;} //тестовая строка, вместоп риветствия
 while (1)
 {
 while (ready);
 int i;
 *a =(char)*buf;
 for (i = 0; i < bufsize; i++)
 {
 a++;
 *a=buf[i];
 tmp[i]= *a;
 //while(!(UCSRA & (1 << UDRE)));
 //UDR = buf[i];
 }
 //for(i=0;i<=7;i++){
 if(!(strcmpP((char *)tmp,cmd0,6))){
 while(*pCmd){
 while(!(UCSRA & (1 << UDRE)));
 UDR = *pCmd;
 pCmd++;}
 }
 //}
 /*else{
 while(*pFail){
 while(!(UCSRA & (1 << UDRE)));
 UDR = *pFail;
 pFail++;}
 }*/
 bufsize = 0;
 ready = 0;
 }
 
 return 0;
 }


