UART не срабатывают условия при сравнении строк.

Обсуждаем контроллеры компании Atmel.
Ответить
Vadim_Stupakov
Открыл глаза
Сообщения: 46
Зарегистрирован: Чт мар 07, 2013 23:55:48
Контактная информация:

UART не срабатывают условия при сравнении строк.

Сообщение Vadim_Stupakov »

Здравствуйте. Передаю данные по uart на ATmega8, хочу что б при отправлении строк, допустим "on" загорался светодиод, но ничего не происходит, а при отправке "1" всё работает. Что не так делаю?
Спойлер

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
#include <string.h>

#if !defined (F_CPU)
#define F_CPU 8000000
#endif


// --------------
// --- USART0 ---
// --------------
char str[20];
void USART0_Transmit(const unsigned char data)
{
	while (!(UCSRA & (1<<UDRE)));
	UDR = data;
}
void USART0_TransmitString(const char *data)
{
	while (*data) USART0_Transmit(*data++);
}
unsigned char USART0_Receive(void)
{
	while (!(UCSRA & (1<<RXC)));
	return UDR;
}
char* USART0_ReceiveString(void)//Работает!
{
	static char receiverData[20];
	unsigned char i = 0;
	for(i = 0; i < 20; i++){
		receiverData[i] = 0;
	}
	i = 0;
	do{
		receiverData[i] = USART0_Receive();
		i++;
	}while(receiverData[i]);
	return receiverData;
}
void USART0_Init(void)
{
	// USART0 settings: 9600 baud 8-n-1
	// WARNING: real baud = 9615: err = 0,156249999999991%
	UBRRH = 0;
	UBRRL = 51;
	UCSRB = (1<<RXEN) | (1<<TXEN);
	UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
}




// -------------
// --- ports ---
// -------------

void Ports_Init(void)
{
	DDRB = 0; // iiiiiiii
	PORTB = 0; // iiiiiiii
	DDRC = 0; // -iiiiiii
	PORTC = 0; // -iiiiiii
	DDRD = 0; // iiiiiiii
	PORTD = 0; // iiiiiiii
	DDRC = 0;
	DDRB = 0;
	DDRD = 0;
	
	DDRC |= (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4) | (1<<5);
	PORTC |= (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4) | (1<<5);
	
	DDRB |= 1<<7;
	PORTB |= 1<<7;
	
	DDRD |= 1<<5;
	PORTD |= 1<<5;
}




// ---------------
// --- ext irq ---
// ---------------

void ExtIrq_Init(void)
{
}







// --------------
// --- main() ---
// --------------

int main()
{
	Ports_Init();
	ExtIrq_Init();
	USART0_Init();
	sei(); // enable interrupts

	// sample code for USART0
	USART0_TransmitString("OK!\r\n");
	for (;;)
	{
		strcpy(str, USART0_ReceiveString() );
		USART0_TransmitString(str);
		if( strcasecmp(str, "0") == 0) PORTD |= 1<<5;//работает
		else if( strcasecmp(str, "1") == 0) PORTD &= ~(1<<5);//работает
		else if( strcasecmp(str, "OFF") == 0) PORTD |= 1<<5;
		else if( strcasecmp(str, "ON") == 0) PORTD &= ~(1<<5);
	}
	return 0;
}
Через терминал строки все обратно доходят.
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: UART не срабатывают условия при сравнении строк.

Сообщение ploop »

Что не так делаю?
А как вы посылаете данные в UART? Судя по коду он примет только нуль-терминированную строку, а это уже зависит от настроек терминала.
Реклама
Vadim_Stupakov
Открыл глаза
Сообщения: 46
Зарегистрирован: Чт мар 07, 2013 23:55:48
Контактная информация:

Re: UART не срабатывают условия при сравнении строк.

Сообщение Vadim_Stupakov »

ploop писал(а):А как вы посылаете данные в UART?
Отправляю строки через терминал со стороны ПК. Эхо работает.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: UART не срабатывают условия при сравнении строк.

Сообщение ploop »

Сделайте не вывод эхо, а вывод str, сразу понятно станет, в чём проблема.
Придётся небольшую отладочную функцию добавить.

Упс, не заметил, у вас так и есть.
Реклама
Эиком - электронные компоненты и радиодетали
Vadim_Stupakov
Открыл глаза
Сообщения: 46
Зарегистрирован: Чт мар 07, 2013 23:55:48
Контактная информация:

Re: UART не срабатывают условия при сравнении строк.

Сообщение Vadim_Stupakov »

Для большей наглядности, прикрепил скрин терминала.
Вложения
Terminal.PNG
Терминал
(17.06 КБ) 662 скачивания
Реклама
Аватара пользователя
blackx
Говорящий с текстолитом
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Re: UART не срабатывают условия при сравнении строк.

Сообщение blackx »

Попробуйте в проверке вместо "ON" вписать "O" и проверьте что получится при отправке строки "on".
Работает ли обычный strcmp?
Изображение only pure true norwegian blackx Изображение
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: UART не срабатывают условия при сравнении строк.

Сообщение ploop »

Да, тут надо методом тыка выяснять. Только один символ работает?
Vadim_Stupakov
Открыл глаза
Сообщения: 46
Зарегистрирован: Чт мар 07, 2013 23:55:48
Контактная информация:

Re: UART не срабатывают условия при сравнении строк.

Сообщение Vadim_Stupakov »

blackx писал(а):Попробуйте в проверке вместо "ON" вписать "O" и проверьте что получится при отправке строки "on".
Работает ли обычный strcmp?

Код: Выделить всё

.................
else if( strcasecmp(str, "O") == 0) PORTD |= 1<<5;
else if( strcasecmp(str, "F") == 0) PORTD &= ~(1<<5);
..
Работает. Но почему-то не работает, если в строке больше 1-го символа..
Аватара пользователя
blackx
Говорящий с текстолитом
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Re: UART не срабатывают условия при сравнении строк.

Сообщение blackx »

А strcmp?
Есть подозрение, что у вас вместо "on" приходит (или сохраняется) что-то вроде "o.n.", где "." - какой-то посторонний символ. То есть дело в терминале.
Еще непонятно, почему вы не учитываете символы переноса строки и возврата каретки ("\r\n"), которые терминал тоже должен передавать при нажатии enter. У вас так и с единственным символом ничего работать не должно.

Если есть возможность, попробуйте другой терминал. Например, Terminal v1.9b by Bray.
Изображение only pure true norwegian blackx Изображение
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: UART не срабатывают условия при сравнении строк.

Сообщение ploop »

Есть подозрение, что у вас вместо "on" приходит (или сохраняется) что-то вроде "o.n.", где "." - какой-то посторонний символ.
Тогда бы USART0_TransmitString их тоже отработал неправильно.
Vadim_Stupakov
Открыл глаза
Сообщения: 46
Зарегистрирован: Чт мар 07, 2013 23:55:48
Контактная информация:

Re: UART не срабатывают условия при сравнении строк.

Сообщение Vadim_Stupakov »

В терминале, с помощью которого я работал, можно отключить символы '\r' & '\n', что я и сделал.
Сейчас поменяю терминал и попробую.
Аватара пользователя
blackx
Говорящий с текстолитом
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Re: UART не срабатывают условия при сравнении строк.

Сообщение blackx »

Еще попробуйте вот так

Код: Выделить всё

#include <stdlib.h> // это нужно для atoi

// ...

int main()
{
   char buf[10]; // !!!
   int i; // !!!

   Ports_Init();
   ExtIrq_Init();
   USART0_Init();
   sei(); // enable interrupts

   // sample code for USART0
   USART0_TransmitString("OK!\r\n");
   for (;;)
   {
      strcpy(str, USART0_ReceiveString() );

      for(i = 0; *str != 0; i++) { // !!!
      	itoa(str[i], buf, 10);
      	USART0_TransmitString(buf);
        USART0_TransmitString("   ");
      }

      if( strcasecmp(str, "0") == 0) PORTD |= 1<<5;//работает
      else if( strcasecmp(str, "1") == 0) PORTD &= ~(1<<5);//работает
      else if( strcasecmp(str, "OFF") == 0) PORTD |= 1<<5;
      else if( strcasecmp(str, "ON") == 0) PORTD &= ~(1<<5);
   }
   return 0;
}
сообщите вывод программы (должна выводить коды символов через пробелы).
Изображение only pure true norwegian blackx Изображение
Vadim_Stupakov
Открыл глаза
Сообщения: 46
Зарегистрирован: Чт мар 07, 2013 23:55:48
Контактная информация:

Re: UART не срабатывают условия при сравнении строк.

Сообщение Vadim_Stupakov »

Хм, blackx, вы действительно оказались правы, правда терминал, который вы посоветовали видит только до COM10 включительно, а у меня шнурок USB->COM и в системе имеет имя "COM12". скачал этот терминал и всё заработало.
Огромное спасибо!
Аватара пользователя
blackx
Говорящий с текстолитом
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Re: UART не срабатывают условия при сравнении строк.

Сообщение blackx »

Получается, терминал из новых AVR Studio лажает?

PS Проверил, у меня Terminal v1.9b by Bray видит все порты (аж до 22-го нашел!) :beer:

ploop, я не спец в кодировках, но по-моему в UTF-8 как раз символы передаются по два байта, и если это ASCII-символ то второй из пары передается как '\0'. Как-то так. Вот и сделал такое предположение.
Изображение only pure true norwegian blackx Изображение
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: UART не срабатывают условия при сравнении строк.

Сообщение ploop »

Нет, UTF-8 как раз совместим с ASCII полностью...
Vadim_Stupakov
Открыл глаза
Сообщения: 46
Зарегистрирован: Чт мар 07, 2013 23:55:48
Контактная информация:

Re: UART не срабатывают условия при сравнении строк.

Сообщение Vadim_Stupakov »

blackx писал(а):Получается, терминал из новых AVR Studio лажает?
Наверное лажает, а возможно я что-то делал не так, как там было задумано.

В общем, Всем спасибо :beer:
Ответить

Вернуться в «AVR»