Страница 1 из 1

Rs232 и Atmega16 на Си

Добавлено: Ср янв 31, 2018 17:29:59
DJZEM
Мужики!!
Я в этом деле не силен, и по этому прошу помощи.
Я не пойму как передать слово и сравнить его.
Умею передавать, получать и сравнивать только одну циферку или буквочку.
А как передавать и получать целые слова? Как их сравнивать??


Вот код на Си
Спойлер

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

#include <avr/io.h>
#include <util/delay.h>

//*** Инициализация UART ***//
void uart_init(void)
{
	//скорость обмена данными
	UBRRH = 0;  //старший байт
	UBRRL = 103; //младший байт
	//8 бит данных, 1 стоп бит, без контроля четности
	UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
	//разрешить прием и передачу данных
	UCSRB = ( 1 << TXEN ) | ( 1 <<RXEN );
}

//*** Прием данных по UART ***//
unsigned char uart_receive(void)
{
	while ( ! ( UCSRA & ( 1 << RXC )));
	return UDR;
}

//*** Передача данных по UART ***//
void uart_transmit(unsigned char data)
{
	while ( ! ( UCSRA & ( 1 << UDRE )));
	UDR = data;
}

//*** Главная программа ***//
int main(void)
{
	DDRD = 0x00;    //установим все порты DDRD как входы
	PORTD = 0x00;   //установим логический 0 на все порты DDRD

	DDRC = (1 << 5) | (1 << 4); //установим порты PC5 и PC4 регистра DDRC на выход
	PORTC &= ~(1 << 5) | ~(1 << 4); //установим сигнал низкого уровня (логическай 0) на выводы PC5 и PC4 регистра DDRC

	char data;
	
	uart_init();
	
	while(1)
	{
		data=uart_receive();
		
		if(data=='A')
		{
			PORTC |= (1 << 5);    //устанавливаем логическую 1 на порт PC5 регистра DDRC
		}
		if(data=='B')
		{
			PORTC &= ~(1 << 5); //устанавливаем логический 0 на порту PC5 регистра DDRC
		}

		if(data=='1')
		{
			PORTC |= (1 << 4);    //устанавливаем логическую 1 на порт PC4 регистра DDRC
		}
		if(data=='0')
		{
			PORTC &= ~(1 << 4); //устанавливаем логический 0 на порту PC4 регистра DDRC
		}
		
		uart_transmit(data);

	};
}
Спасибо

Re: Rs232 и Atmega16 на Си

Добавлено: Чт фев 01, 2018 16:13:35
Myp3ik
Допустим есть слово

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

const char *const keyWord = {"Hello!"};
которое нужно найти в буфере приема

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

char buffer[] = {"Hello!"};

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

if (!strncmp(buffer, keyWord, strlen(keyWord)))
{
	// Совпадение	
}
или без библиотеки поэлементно в цикле сравнить два массива символов.

Re: Rs232 и Atmega16 на Си

Добавлено: Пт фев 02, 2018 01:12:07
DJZEM
А если в принятом буфере, кроме нужного слова, еще какой то мусор?? Типа там, начало, перенос и т д, как отсеять??

Re: Rs232 и Atmega16 на Си

Добавлено: Пт фев 02, 2018 04:06:58
Myp3ik