roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 дек 2024, 22:49

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Проблема с UART - прием и передача (AVR)
СообщениеДобавлено: 21 апр 2011, 11:43 
Не в сети

Зарегистрирован: 21 апр 2011, 11:33
Сообщения: 2
Доброго всем дня !

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с UART - прием и передача (AVR)
СообщениеДобавлено: 22 апр 2011, 14:40 
Не в сети

Зарегистрирован: 07 авг 2010, 21:29
Сообщения: 1725
Откуда: КМВ
прог. языки: C
ФИО: Андрей
На форуме есть ИИ, (написанный Setar'ом по слухам).
Этот ИИ - автор курса, в одной из задач которого ОЧЕНЬ подробно расписана работа с последовательным портом: http://www.123avr.com/z4.htm

_________________
Дым, идущий из всех устройств в помещении предвещает появление электрика.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с UART - прием и передача (AVR)
СообщениеДобавлено: 22 апр 2011, 19:49 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
точнее так - http://www.robot.roboforum.ru/z5.htm - работа с UART AVR и LCD символьный.

Там пример буфера который в который автоматом валятся принятые символы, он и для WinAVR должен подойти.

Далее вы в строке прямо проверяете, не знаю хорошо ли так но видел гдето.

Код:
while (! rx_counter ); // ждем поступления символа в буфер - "пока счетчик буфера rx_counter равен 0"

if( ( getchar()== символ 1 ) && ( аналогично символ 2) && ( аналогично символ 3) и так далее )
{
здесь окажемся если принята именно такая последовательность

else {
здесь если в приеме возник сбой
}

_________________
Читайте !


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO