Пишу программу для прием и передачи строки для 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;
}