@1bd_1l_Bari

Проблемы с USART?

Приветствую.
Суть : через терминал посылаются байты 0, либо 1, либо 2. В зависимости от этого светодиод зажигается либо 1, либо 2, либо 3 раза.

Проблема: когда посылаю 2, то должен сразу 3 раза поморгать светодиод, однако приходится 2 посылать 3 раза, и только на 3-й раз светодиод моргает 3 раза. Тоже самое когда посылаю 0 или 1, только на второй раз начинает нормально моргать светодиод (т.е только когда второй раз байт отправил).
В чем причина?

Вот код на Atmel Studio.

#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/delay.h>
#include "USART.h"




void led_blink()
{
	if(USART_reciv() == '0') //моргаем 1 раз
	{
		
		PORTB |= (1 << 2);
		_delay_ms(100);
		PORTB &= ~(1 << 2);
	}
	else if(USART_reciv() == '1') // моргаем 2 раза
	{
		
		PORTB |= (1 << 2);
		_delay_ms(100);
		PORTB &= ~(1 << 2);
		_delay_ms(100);
		PORTB |= (1 << 2);
		_delay_ms(100);
		PORTB &= ~(1 << 2);
	}
	else if(USART_reciv() == '2') // если прислали 2, то моргаем 3 раза
	{
		
		PORTB |= (1 << 2);
		_delay_ms(100);
		PORTB &= ~(1 << 2);
		_delay_ms(100);
		PORTB |= (1 << 2);
		_delay_ms(100);
		PORTB &= ~(1 << 2);
		_delay_ms(100);
		PORTB |= (1 << 2);
		_delay_ms(100);
		PORTB &= ~(1 << 2);
	}
}


int main(void)
{
 
	DDRB = 0xFF; // led
	DDRD |= (1 << 1); //tx
	DDRD &= ~(1 << 0); //rx 
	
	USART_init(MYUBRR); //инициализируем USART, MYUBRR - это скорость передачи, по спец формуле рассчитывается
	
	USART_transmit('O'); USART_transmit('k'); USART_transmit('!'); USART_transmit(0x0d); 
        USART_transmit(0x0a); //отправляем "Ок!" в терминал, чтобы проверить работу USART
	
	
	
    while (1) 
    {
		led_blink();
		_delay_ms(10); // думал поставить задержку, чтобы решить проблему, но все так же
    }
}
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
Предполагаю, что результат функции USART_reciv() нужно сохранить в переменную и только потом сравнивать с заданными значениями.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vanyamba-electronics
Скорее всего причина в том, что нужно проверять значение принятого байта, а не принимать новый байт каждый раз:
char ch = USART_reciv();
if (ch == '1') {
   ...
}
else if (ch == '2') {
   ...
}
else if (ch == '3') {
   ...
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы