реклама на сайте
подробности

 
 
> USART передача пакетов, Получаю только первый пакет
Anub
сообщение Aug 16 2008, 12:11
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 26-05-08
Пользователь №: 37 825



Имеется два МК между которыми необходимо произвести пакетную передачу команд. Первый мк отсылает два пакета с периодом в пол секунды после чего дает на порта лог1 и уходит в бесконечный цикл.
Переменные
Код
char COMMAND[30];
int i = 0;

Код

      putsf("run/");
      delay_ms(500);
      putsf("runb/");
      PORTA=0xFF;
      while(1){};

Второй МК принимает эти пакеты в обработчике прерывания получения символа. Обработчик собирает все сибволы в массив пока не будет получен символ окончания пакета - /.
Код
if (data != '/')
   {
   COMMAND[i] = data;
   i++;  
   }
else
   {
   i = 0;
   activeCommand(COMMAND);
   }
}

Функция activeCommand проверяет совпадения и если совпадения верны то отправляет в потра разные комбинации(зажигает нужные светодиоды)
Код
void activeCommand(char c[])
{  
if (c[0]=='r'&c[1]=='u'&c[2]=='n')
   {
   PORTA=0x03;  
   }
if (c[0]=='r'&c[1]=='u'&c[2]=='n'&c[3]=='b')
   {
   PORTA=0x07;
   }
}

Проблема состоит в том что первый пакет передается и проверяется правильно, а вот на второй пакет реакцию нулевая.
И еще пугает вот что - на RXD принимающего напряжение равное напряжению питания...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Anub
сообщение Aug 16 2008, 13:51
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 26-05-08
Пользователь №: 37 825



Код
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer[rx_wr_index]=data;
   if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
      {
      rx_counter=0;
      rx_buffer_overflow=1;
      };
   };
if (data != '/')
   {
   COMMAND[i] = data;
   i++;  
   }
else
   {
   i = 0;
   activeCommand(COMMAND);
   }
   PORTC=0x00;
}


Код
void activeCommand(char c[])
{  
if (c[0]=='r'&&c[1]=='u'&&c[2]=='n')
   {
   PORTA=0x03;  
   }          
if (c[0]=='r'&&c[1]=='u'&&c[2]=='n'&&c[3]=='b')
   {
   PORTA=0x07;
   }
   PORTC=0xFF;
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 06:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016