Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить

Rs232 и Atmega16 на Си

Ср янв 31, 2018 17:29:59

Мужики!!
Я в этом деле не силен, и по этому прошу помощи.
Я не пойму как передать слово и сравнить его.
Умею передавать, получать и сравнивать только одну циферку или буквочку.
А как передавать и получать целые слова? Как их сравнивать??


Вот код на Си

Спойлер
Код:
#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

Допустим есть слово

Код:
const char *const keyWord = {"Hello!"};


которое нужно найти в буфере приема

Код:
char buffer[] = {"Hello!"};


Код:
if (!strncmp(buffer, keyWord, strlen(keyWord)))
{
   // Совпадение   
}


или без библиотеки поэлементно в цикле сравнить два массива символов.

Re: Rs232 и Atmega16 на Си

Пт фев 02, 2018 01:12:07

А если в принятом буфере, кроме нужного слова, еще какой то мусор?? Типа там, начало, перенос и т д, как отсеять??

Re: Rs232 и Atmega16 на Си

Пт фев 02, 2018 04:06:58

http://all-ht.ru/inf/prog/c/func/strstr.html
Ответить