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

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

Сообщение cancerogen16 »

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

Сообщение DimanVIP »

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

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

Сообщение cancerogen16 »

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

Сообщение phanis »

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

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

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

Сообщение cancerogen16 »

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

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

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

Сообщение 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), но не могу определить, начался новый символ или нет. Может я ошибаюсь, поправьте, пожалуйста.
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

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

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

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

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

Сообщение cancerogen16 »

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

Сообщение cancerogen16 »

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

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

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

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

Сообщение pyzhman »

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

Сообщение YS »

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

Сообщение DimanVIP »

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

Сообщение Meteor »

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

Сообщение YS »

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

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

Сообщение ARV »

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

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

Сообщение pyzhman »

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

Сообщение Meteor »

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

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