Приём строки по UART в AVR

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
cancerogen16
Родился
Сообщения: 8
Зарегистрирован: Пт июл 15, 2011 06:48:59

Приём строки по UART в AVR

Сообщение cancerogen16 »

Привет всем! Подскажите, кто-нибудь, есть реальный код, чтобы принять по UART строку символов? Всё облазил, ничего толкового найти не могу.
Реклама
Аватара пользователя
DimanVIP
Мучитель микросхем
Сообщения: 474
Зарегистрирован: Вт июн 01, 2010 22:12:07
Откуда: Тольятти
Контактная информация:

Re: Приём строки по UART в AVR

Сообщение DimanVIP »

Реальный код есть!

А вот его реализация зависит, как минимум, от компилятора и применяемого камня.
[img]http://nekuru.com/images/DimanVIP/t2.png[/img]
Реклама
cancerogen16
Родился
Сообщения: 8
Зарегистрирован: Пт июл 15, 2011 06:48:59

Re: Приём строки по UART в AVR

Сообщение cancerogen16 »

Сейчас я мучаю CVAVR и ATmega8. Проблема в том, что неизвестна длина принимаемой строки. Как определить, что строка кончилась?
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: Приём строки по UART в AVR

Сообщение phanis »

по тайм ауту, а можно посылку с использованием служебных символов(начало посылка конец). или если счетчик принятых байт равен требуемому числу(можно в посылке указывать).
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: Приём строки по UART в AVR

Сообщение radio-kot »

по таймауту можно.
Будете проходить мимо- проходите!
Реклама
cancerogen16
Родился
Сообщения: 8
Зарегистрирован: Пт июл 15, 2011 06:48:59

Re: Приём строки по UART в AVR

Сообщение cancerogen16 »

Лучше я скажу для чего мне нужен этот код. Я хочу соорудить что-то вроде бортового компьютера для автомобиля. Работать он будет по протоколу OBD2. Послать данные по UART я смогу, а вот с приёмом проблемы. Опять же, повлиять на принимаемые данные я не могу, так же как и не могу заранее узнать длину строки. Вот такие дела. Короче, надеюсь на вашу конкретную помощь.
Реклама
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: Приём строки по UART в AVR

Сообщение radio-kot »

Вот прием данных по UART атоматический в буфер желаемой длины -
www.proavr.narod.ru/z5.htm
Будете проходить мимо- проходите!
cancerogen16
Родился
Сообщения: 8
Зарегистрирован: Пт июл 15, 2011 06:48:59

Re: Приём строки по UART в AVR

Сообщение cancerogen16 »

Не поймите меня превратно, но это нельзя применить. Есть в CodeVision вариант, когда известна длина строки

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


char *gets(char *str,unsigned int len)
{
unsigned int n=len;
#endif
char *p=str;
char k;

while (n)
      {
      l0:
      k=getchar();
      if (k==8)
         {
         if (len>n)
            {
            --p;
            ++n;
            };
         goto l0;
         };
      if (k==10) break;
      *p++=k;
      --n;
      };
*p=0;
return str;
}
Но как быть, если длина неизвестна? Я пробовал по таймауту, но не получилось, т.к. я могу определить, когда закончился символ( прерывание RXC), но не могу определить, начался новый символ или нет. Может я ошибаюсь, поправьте, пожалуйста.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Приём строки по UART в AVR

Сообщение pyzhman »

Если длина строки переменная и нет признака конца сироки, то выход один - таймаут. После приема очередного байта запускаете таймер; если он сработал, значит строка принята. Конечно, должно быть согласовано с передающей стороной, а как же еще?
Docendo discimus
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: Приём строки по UART в AVR

Сообщение radio-kot »

cancerogen16 писал(а): Может я ошибаюсь, поправьте, пожалуйста.
Конечно ошибаетесь. По ссылке выше подробно все описано.

Как только поступит новый импульс счетчик буфера станет не нулевым.
Будете проходить мимо- проходите!
cancerogen16
Родился
Сообщения: 8
Зарегистрирован: Пт июл 15, 2011 06:48:59

Re: Приём строки по UART в AVR

Сообщение cancerogen16 »

pyzh_man писал(а):Если длина строки переменная и нет признака конца сироки, то выход один - таймаут. После приема очередного байта запускаете таймер; если он сработал, значит строка принята. Конечно, должно быть согласовано с передающей стороной, а как же еще?
Я извиняюсь. Как я понимаю, таймер должен запускаться когда закончен приём одного байта и вырубаться когда начат приём следующего. Или момент начала приёма засечь нельзя? Тогда придётся увеличивать таймаут на длительность байта.
cancerogen16
Родился
Сообщения: 8
Зарегистрирован: Пт июл 15, 2011 06:48:59

Re: Приём строки по UART в AVR

Сообщение cancerogen16 »

radio-kot писал(а):
cancerogen16 писал(а): Может я ошибаюсь, поправьте, пожалуйста.
Конечно ошибаетесь. По ссылке выше подробно все описано.

Как только поступит новый импульс счетчик буфера станет не нулевым.
Можете написать здесь подробный пример приёма строки произвольной длины и, например, вывода её обратно? Типа такого

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

 scanf("%X",*command);
printf ("%X",*command);
Кстати, функция scanf() мне не поможет?
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Приём строки по UART в AVR

Сообщение pyzhman »

Делаем так:
1. Принимаем байт.
2. После приема, не важно в прерывании по приему или без прерывания у вас организовано, запускаем таймер.
3. Ждем приема следующего байта, отслеживая состояние таймера.
4. Если принят байт, перезапускаем таймер. Если сработал таймер, то принимаем решение о конце строки.
Таймер ставим ну скажем на одну секунду. Таким образом время передачи одного байта несущественно. Критерий таймера - перерыв между посылками строк.
Docendo discimus
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Приём строки по UART в AVR

Сообщение YS »

Вообще-то, стандартное соглашение С о хранении строки подразумевает, что она должна оканчиваться нулем. Вот ноль и отлавливайте. По прерыванию складывайте символы в буфер, которого заведомо хватит, а по приему нуля выставляйте флаг готовности.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
DimanVIP
Мучитель микросхем
Сообщения: 474
Зарегистрирован: Вт июн 01, 2010 22:12:07
Откуда: Тольятти
Контактная информация:

Re: Приём строки по UART в AVR

Сообщение DimanVIP »

Так скорее всего не пойдет. Ибо НУЛЬ может проскочить и в середине посылки.
[img]http://nekuru.com/images/DimanVIP/t2.png[/img]
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Приём строки по UART в AVR

Сообщение Meteor »

Тут надо поточнее, что есть нуль:0х30 или 0х00(NULL)?
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Приём строки по UART в AVR

Сообщение YS »

Ибо НУЛЬ может проскочить и в середине посылки.
С какой радости? Коду 0x00 не соответствует ни один символ, это чисто служебный код.

Я понимаю строку в ее классическом смысле - строка символов. Если это что-то другое по идеологии, это уже не строка в ее каноническом понимании, а просто массив.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18656
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Приём строки по UART в AVR

Сообщение ARV »

YS писал(а):С какой радости? Коду 0x00 не соответствует ни один символ, это чисто служебный код.
Я понимаю строку в ее классическом смысле - строка символов. Если это что-то другое по идеологии, это уже не строка в ее каноническом понимании, а просто массив.
в каноническом понимании при передачи строки НИКОГДА не передается завершающий ноль (NULL)если интерфейс обмена данными текстовый (ASCII), то чаще всего в конце строки передается символы \n или \r или оба сразу
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Приём строки по UART в AVR

Сообщение pyzhman »

Поскольку автор говорит о строке, то разумно предположить, что признак конца - 0х00. Тогда и ловить его и не моротить таймера. Хотя с чем там имеет дело автор на самом деле - :dont_know: .
Docendo discimus
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Приём строки по UART в AVR

Сообщение Meteor »

Автор не указал что за строка у него: текстовая или числоая..
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»