Например TDA7294

Форум РадиоКот • Просмотр темы - Передача строки по UART
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пн июл 21, 2025 15:48:57

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 111 ]  1, , , , ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Передача строки по UART
СообщениеДобавлено: Вс янв 08, 2017 12:16:21 
Открыл глаза

Зарегистрирован: Пн янв 11, 2016 20:35:49
Сообщений: 54
Рейтинг сообщения: 0
Добрый вечер. Программирование на МК начал только изучать.
Задался вопрос передать с программы на ПК строку в МК, и в условии на МК уже сравнивать и выполнять те или иные действия. Как передать один байт с ПК на МК я разобрался, а вот как быть со строкой? Если там скажем в команде по пять символов?
В принципе алгоритм понятен, но реализовать что то пока не могу. Пишу на Atmel Studio 7
Может кто чем поможет? Или на примере покажет?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Вс янв 08, 2017 12:42:09 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4565
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
LEX38RUS писал(а):
Как передать один байт с ПК на МК я разобрался, а вот как быть со строкой?
Дак строка - это n-ное кол-во байтов. Если один байт можете передать, почему не можете несколько ? :dont_know:
Если честно, не понятно, что Вам непонятно. Поподробнее... И с кусками кода...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Вс янв 08, 2017 12:43:59 
Открыл глаза

Зарегистрирован: Пн янв 11, 2016 20:35:49
Сообщений: 54
Рейтинг сообщения: 0
Вопрос в том как их принять и сложить в строку


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Вс янв 08, 2017 12:46:45 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4565
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Заводим массив и переменную, которая будет индексом в массиве (порядковый номер байта) и по-одному байтику, инкрементируя индекс, принимаем.


Вернуться наверх
 
Выбираем индустриальные и медицинские источники питания MEAN WELL в открытом исполнении

Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Вс янв 08, 2017 13:37:18 
Открыл глаза

Зарегистрирован: Пн янв 11, 2016 20:35:49
Сообщений: 54
Рейтинг сообщения: 0
Еще нет столько опыта в написание такого рода код. Может кто поможет в реализации?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Вс янв 08, 2017 13:48:34 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4565
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Чтобы Вам помочь, нужно знать чем конкретно. Для начала, покажите что у Вас есть на данный момент.


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Вс янв 08, 2017 14:09:40 
Открыл глаза

Зарегистрирован: Пн янв 11, 2016 20:35:49
Сообщений: 54
Рейтинг сообщения: 0
Код:
#include <avr/io.h>
#define F_CPU 8000000UL //8MHz
#include <util/delay.h>
#include <avr/interrupt.h>

uint8_t receive = 0;
uint8_t rx_data = 0;
volatile uint8_t rx_flag = 0;

void UARTInit(void) {
   UBRRH = 0;
   UBRRL = 51;
   UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
   UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

//void UARTSend(uint8_t data) {
//   while(!(UCSRA & (1<<UDRE)));
//   UDR = data;
//}

unsigned char UARTGet() {
   while(!rx_flag);
   rx_flag = 0;
   return rx_data;
}

int main(void) {
   DDRC = 0b00000001;
   sei();
   UARTInit();
   while(1) {
      receive = UARTGet();
      if(receive == 0b00110001)
      {
         PORTC = 0b00000001;
      }
            if(receive == 0b00110010)
            {
               PORTC = 0b00000000;
            }
   }
}

ISR(USART_RXC_vect) {
   rx_data = UDR;
   rx_flag = 1;
}

Код слизан. Но принцип работы я понимаю кода. Ну и соответственно проверка, если пришел символ 1 то зажигаем диод если 2 то гасим. С этим все понятно и можно работать так в принципе, но охота до ума довести и сделать как отправку команд, допустим с ПК отправляю On и диод зажигаем, отправляю Off диод гасим.
Вот и не могу докубатурить как организовать так чтоб принял байты, закончил прием, сложил их и можно было сравнить потом со строкой скажем так if(buffer == "On"{зажигаем диод}
Вообщем с передачей и проверкой по одному байту проблем нет, а вот принять строку и проверить ее в условии проблема есть.
За ранее благодарю.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Вс янв 08, 2017 16:00:20 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4565
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Вот у Вас обработчик прерываний по приёму байта :
Код:
ISR(USART_RXC_vect) {
   rx_data = UDR;
   rx_flag = 1;
}
В нём и заполняйте массив. А окончание приёма строки будет по нулевому байту.
Сначала добейтесь полноценного приёма строки, а парсинг - дело второстепенное, займётесь им потом.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Пн янв 09, 2017 02:26:03 
Открыл глаза

Зарегистрирован: Пн янв 11, 2016 20:35:49
Сообщений: 54
Рейтинг сообщения: 0
Допустим записал я в масив байты. Кпк мне далее этот масив сравнить с текстом? Через sprintf?
К примеру имеем массив buffer_byt и его нужно сравнить с текстом скажем "ON"


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Пн янв 09, 2017 04:32:33 
Первый раз сказал Мяу!

Зарегистрирован: Чт сен 20, 2012 11:57:28
Сообщений: 36
Откуда: Владивосток
Рейтинг сообщения: 0
Напрямую работать со строками в микроконтроллере нельзя. По крайней мере на С и асм. Строка это в любом случае массив, наполненный символами. Если так хочется писать on и off, то я бы сделал так. В цикле for читаем строку, допустим до нулевого символа и затем сравниваем с эталонными значениями других массивов (на самом деле я бы даже взял второй элемент массива и сравнил его с символом 'f' или 'n', это если не использовать защит от неправильно введенных символов). И в зависимости от полученного значения устанавливать флаг, от которого и будет зависеть дальнейший алгоритм действий.
Могу в чем то ошибаться, так как сам далеко не большой специалист в программировании.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Пн янв 09, 2017 06:14:25 
Открыл глаза

Зарегистрирован: Пн янв 11, 2016 20:35:49
Сообщений: 54
Рейтинг сообщения: 0
В планах было сделать так, что если отправлена команда с ПК и содержит первый символ # то начинаем писать последующие принятые байты в массив и по принятию скажем последнего какого нибудь символа заканчиваем писать и принимать данные. Подобный пример находил в инете. Но не то. Для меня остаётся не понятным как мне сравнить данные которые записаны в массиве с другой строкой.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Пн янв 09, 2017 06:19:01 
Первый раз сказал Мяу!

Зарегистрирован: Чт сен 20, 2012 11:57:28
Сообщений: 36
Откуда: Владивосток
Рейтинг сообщения: 3
LEX38RUS писал(а):
Но не то. Для меня остаётся не понятным как мне сравнить данные которые записаны в массиве с другой строкой.

Другая строка - это тоже массив. То есть побайтово и сравниваем элементы каждого массива


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Пн янв 09, 2017 07:45:59 
Опытный кот
Аватар пользователя

Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42
Сообщений: 744
Откуда: Караганда, Казахстан
Рейтинг сообщения: 0
Аlex писал(а):
В нём и заполняйте массив. А окончание приёма строки будет по нулевому байту.
Только не по нулю. Если набор идет с терминала, признаком окончания строки, обычно, служит символ <CR> (0x0D). А еще нужно решить вопрос с эхом - правильной реализацией будет пользовать терминал в режиме "без эха", а эхо делать самому, передавая каждый полученный символ назад. Получив <CR>, нужно занести в буфер строки нулевой байт, как признак конца этой строки, а "эхом" вернуть символы <CR>,<LF> (0x0D, 0x0A), после чего отметить основной программе, что строка получена. Ну, и не забыть, получая каждый байт, контролировать буфер строки на переполнение.

_________________
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Пн янв 09, 2017 07:58:29 
Первый раз сказал Мяу!

Зарегистрирован: Чт сен 20, 2012 11:57:28
Сообщений: 36
Откуда: Владивосток
Рейтинг сообщения: 0
afz писал(а):
Аlex писал(а):
В нём и заполняйте массив. А окончание приёма строки будет по нулевому байту.
Только не по нулю. Если набор идет с терминала, признаком окончания строки, обычно, служит символ <CR> (0x0D). А еще нужно решить вопрос с эхом - правильной реализацией будет пользовать терминал в режиме "без эха", а эхо делать самому, передавая каждый полученный символ назад. Получив <CR>, нужно занести в буфер строки нулевой байт, как признак конца этой строки, а "эхом" вернуть символы <CR>,<LF> (0x0D, 0x0A), после чего отметить основной программе, что строка получена. Ну, и не забыть, получая каждый байт, контролировать буфер строки на переполнение.

Это уже тонкости, на мой взгляд. Насколько я понял, человек не может понять как сравнить полученный массив со строкой с эталонной строкой.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Пн янв 09, 2017 08:42:21 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1478
Рейтинг сообщения: 0
В качестве примеров.
Код:
//----------
void _Print_Buf (u08 x, char __flash *data);
#define Print_Buf(x, data) _Print_Buf(((x)-1), (data))
//----------

//==================
void _Print_Buf (u08 x, char __flash *data)
{
   for (u08 i = 0; data [i] != 0;)
   {
      dsp_buf [x++] = data [i++];
   }

//   init_dsp_buf ();
}
//==================

//==================
struct msg_cmd __flash table_msg_cmd [] =
{
   {"CH1",     KEY_ESC_COD},
   {"CH2",     KEY_ENTER_COD},
   {"CH3",     TEST_CMD},
   {NULL_TEXT, NULL_CMD},
};

u08 select_cmd (void)
{
   struct msg_cmd __flash *ptr = table_msg_cmd;

   while (ptr -> msg)
   {
      char __flash *ptr_2 = ptr -> msg;

      for (u08 i = 0; i < mirf_PAYLOAD; i++)
      {
         if (!ptr_2 [i]) return ptr -> cmd;

         if (ptr_2 [i] != mirf_buf [i]) break;
      }

      ptr++;
   }

   return false;
}

bool select_msg (u08 a)
{
   struct msg_cmd __flash *ptr = table_msg_cmd;

   for (; ptr -> msg; ptr++)
   {
      if (a == ptr -> cmd)
      {
         print_buf (mirf_buf, 1, ptr -> msg);
         return true;
      }
   }

   return false;
}
//==================


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Пн янв 09, 2017 09:01:21 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 3
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
существуют же стадартные функции для работы со строками!
scanf - прием строки
strcmp - сравнение строк
есть и другие с разными нюансами - почему бы не пользоваться ими? почему начинающему всегда стремятся дать советы, как сделать посложнее?

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Пн янв 09, 2017 09:10:22 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1478
Рейтинг сообщения: 0
ARV писал(а):
...

Существуют. Лично я экономлю память МК. Как Flash так и SRAM. При подключении стандартных библиотек пару килобайт flash, а то и больше, сразу можно списывать. Не говоря уж о SRAM.
Пы Сы Я же написал, "пример". Дальше дело ТС, что он будет делать. Использовать примеры или стандартные библиотеки.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Пн янв 09, 2017 09:21:09 
Первый раз сказал Мяу!

Зарегистрирован: Чт сен 20, 2012 11:57:28
Сообщений: 36
Откуда: Владивосток
Рейтинг сообщения: 0
ARV писал(а):
очему начинающему всегда стремятся дать советы, как сделать посложнее?

Мне, как начинающему, проще работать не со стандартными функциями (о которых я собственно и не знал :)), а тем более знающие люди говорят, что памяти сжирают много ), а со своими. По крайней мере в данном случае можно ознакомиться с оператором for, массивами, ну и большом желании, с указателями..


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Пн янв 09, 2017 10:11:22 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 6
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
tux писал(а):
Мне, как начинающему, проще работать не со стандартными функциями (о которых я собственно и не знал
т.е. изобретение велосипеда - это, по-вашему, проще? пока все едут, вы изобретаете, так? я понимаю случай, когда программист собаку съел на алгоритмах и способен конкурировать со стандартными функциями, решая задачи оптимизации и т.п. но когда начинающий, еще не сделавший сортировку пузырьком ни разу, вдруг решает, что самописные функции будут лучше - это, имхо, нонсенс.

понимать, как работает сравнение строк - да, необходимо. писать это самому - нет, не всегда.

Demiurg писал(а):
Лично я экономлю память МК. Как Flash так и SRAM. При подключении стандартных библиотек пару килобайт flash, а то и больше, сразу можно списывать.
не скажу, что это голословное утверждение, но сильно-сильно сомневаюсь в его истинности. расход памяти, конечно, имеет место быть, но ведь и самописная реализация какой-то функции потребует расходов... и не факт, что получится без ошибок.

Demiurg писал(а):
Дальше дело ТС, что он будет делать
начинающего вести за ручку надо до тех пор, пока он не обретет опыт и станет способен самостоятельно принимать такие решения. даже для меня нет однозначного выбора между самописным вариантом приема строки из UART и scanf - я буду думать долго, а что взять с начинающего?

но учиться (и учить) все-таки лучше от простого к сложному, от готового к нестандартному. avr-libc должна быть основой, настольной книгой, и только суровая действительность может быть основанием отказаться от нее.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Передача строки по UART
СообщениеДобавлено: Пн янв 09, 2017 10:22:38 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1478
Рейтинг сообщения: 0
ARV писал(а):
...

Смотрите:
Код:
//----------
void _Print_Buf (u08 x, char __flash *data);
#define Print_Buf(x, data) _Print_Buf(((x)-1), (data))
//----------

//==================
void _Print_Buf (u08 x, char __flash *data)
{
   for (u08 i = 0; data [i] != 0;)
   {
      dsp_buf [x++] = data [i++];
   }
}
//==================

   Print_Buf (2, 12, "Ваш текст");

Я работаю с символьными дисплеями так: создается буфер размером MAX_X*MAX_Y. Дисплей работает только на запись, чтения нет. Раз в 1 мс посимвольно отправляется содержимое буфера дисплея. Полное обновление дисплея происходит за MAX_X*MAX_Y + кол-во адресов строк. При дисплее 20х4 за 84 мс. Это сделано из-за того, что если на дисплей долго что-то не отправлять, на дисплее появляются кракозябры, которые появляются из-за помех.

Сравните на досуге, сколько памяти займет мой способ и с применением стандартных библиотек.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 111 ]  1, , , , ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Agaev и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y