Приём строки по UART в AVR
-
cancerogen16
- Родился
- Сообщения: 8
- Зарегистрирован: Пт июл 15, 2011 06:48:59
Приём строки по UART в AVR
Привет всем! Подскажите, кто-нибудь, есть реальный код, чтобы принять по UART строку символов? Всё облазил, ничего толкового найти не могу.
- Реклама
- DimanVIP
- Мучитель микросхем
- Сообщения: 474
- Зарегистрирован: Вт июн 01, 2010 22:12:07
- Откуда: Тольятти
- Контактная информация:
Re: Приём строки по UART в AVR
Реальный код есть!
А вот его реализация зависит, как минимум, от компилятора и применяемого камня.
А вот его реализация зависит, как минимум, от компилятора и применяемого камня.
[img]http://nekuru.com/images/DimanVIP/t2.png[/img]
-
cancerogen16
- Родился
- Сообщения: 8
- Зарегистрирован: Пт июл 15, 2011 06:48:59
Re: Приём строки по UART в AVR
Сейчас я мучаю CVAVR и ATmega8. Проблема в том, что неизвестна длина принимаемой строки. Как определить, что строка кончилась?
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: Приём строки по UART в AVR
по тайм ауту, а можно посылку с использованием служебных символов(начало посылка конец). или если счетчик принятых байт равен требуемому числу(можно в посылке указывать).
- Реклама
-
cancerogen16
- Родился
- Сообщения: 8
- Зарегистрирован: Пт июл 15, 2011 06:48:59
Re: Приём строки по UART в AVR
Лучше я скажу для чего мне нужен этот код. Я хочу соорудить что-то вроде бортового компьютера для автомобиля. Работать он будет по протоколу OBD2. Послать данные по UART я смогу, а вот с приёмом проблемы. Опять же, повлиять на принимаемые данные я не могу, так же как и не могу заранее узнать длину строки. Вот такие дела. Короче, надеюсь на вашу конкретную помощь.
Re: Приём строки по UART в AVR
Вот прием данных по UART атоматический в буфер желаемой длины -
www.proavr.narod.ru/z5.htm
www.proavr.narod.ru/z5.htm
Будете проходить мимо- проходите!
-
cancerogen16
- Родился
- Сообщения: 8
- Зарегистрирован: Пт июл 15, 2011 06:48:59
Re: Приём строки по UART в AVR
Не поймите меня превратно, но это нельзя применить. Есть в CodeVision вариант, когда известна длина строки
Но как быть, если длина неизвестна? Я пробовал по таймауту, но не получилось, т.к. я могу определить, когда закончился символ( прерывание RXC), но не могу определить, начался новый символ или нет. Может я ошибаюсь, поправьте, пожалуйста.
Код: Выделить всё
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;
}
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Приём строки по UART в AVR
Если длина строки переменная и нет признака конца сироки, то выход один - таймаут. После приема очередного байта запускаете таймер; если он сработал, значит строка принята. Конечно, должно быть согласовано с передающей стороной, а как же еще?
Docendo discimus
Re: Приём строки по UART в AVR
Конечно ошибаетесь. По ссылке выше подробно все описано.cancerogen16 писал(а): Может я ошибаюсь, поправьте, пожалуйста.
Как только поступит новый импульс счетчик буфера станет не нулевым.
Будете проходить мимо- проходите!
-
cancerogen16
- Родился
- Сообщения: 8
- Зарегистрирован: Пт июл 15, 2011 06:48:59
Re: Приём строки по UART в AVR
Я извиняюсь. Как я понимаю, таймер должен запускаться когда закончен приём одного байта и вырубаться когда начат приём следующего. Или момент начала приёма засечь нельзя? Тогда придётся увеличивать таймаут на длительность байта.pyzh_man писал(а):Если длина строки переменная и нет признака конца сироки, то выход один - таймаут. После приема очередного байта запускаете таймер; если он сработал, значит строка принята. Конечно, должно быть согласовано с передающей стороной, а как же еще?
-
cancerogen16
- Родился
- Сообщения: 8
- Зарегистрирован: Пт июл 15, 2011 06:48:59
Re: Приём строки по UART в AVR
Можете написать здесь подробный пример приёма строки произвольной длины и, например, вывода её обратно? Типа такогоradio-kot писал(а):Конечно ошибаетесь. По ссылке выше подробно все описано.cancerogen16 писал(а): Может я ошибаюсь, поправьте, пожалуйста.
Как только поступит новый импульс счетчик буфера станет не нулевым.
Код: Выделить всё
scanf("%X",*command);
printf ("%X",*command);- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Приём строки по UART в AVR
Делаем так:
1. Принимаем байт.
2. После приема, не важно в прерывании по приему или без прерывания у вас организовано, запускаем таймер.
3. Ждем приема следующего байта, отслеживая состояние таймера.
4. Если принят байт, перезапускаем таймер. Если сработал таймер, то принимаем решение о конце строки.
Таймер ставим ну скажем на одну секунду. Таким образом время передачи одного байта несущественно. Критерий таймера - перерыв между посылками строк.
1. Принимаем байт.
2. После приема, не важно в прерывании по приему или без прерывания у вас организовано, запускаем таймер.
3. Ждем приема следующего байта, отслеживая состояние таймера.
4. Если принят байт, перезапускаем таймер. Если сработал таймер, то принимаем решение о конце строки.
Таймер ставим ну скажем на одну секунду. Таким образом время передачи одного байта несущественно. Критерий таймера - перерыв между посылками строк.
Docendo discimus
Re: Приём строки по UART в AVR
Вообще-то, стандартное соглашение С о хранении строки подразумевает, что она должна оканчиваться нулем. Вот ноль и отлавливайте. По прерыванию складывайте символы в буфер, которого заведомо хватит, а по приему нуля выставляйте флаг готовности.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- DimanVIP
- Мучитель микросхем
- Сообщения: 474
- Зарегистрирован: Вт июн 01, 2010 22:12:07
- Откуда: Тольятти
- Контактная информация:
Re: Приём строки по UART в AVR
Так скорее всего не пойдет. Ибо НУЛЬ может проскочить и в середине посылки.
[img]http://nekuru.com/images/DimanVIP/t2.png[/img]
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Re: Приём строки по UART в AVR
Тут надо поточнее, что есть нуль:0х30 или 0х00(NULL)?
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Re: Приём строки по UART в AVR
С какой радости? Коду 0x00 не соответствует ни один символ, это чисто служебный код.Ибо НУЛЬ может проскочить и в середине посылки.
Я понимаю строку в ее классическом смысле - строка символов. Если это что-то другое по идеологии, это уже не строка в ее каноническом понимании, а просто массив.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18656
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Приём строки по UART в AVR
в каноническом понимании при передачи строки НИКОГДА не передается завершающий ноль (NULL)если интерфейс обмена данными текстовый (ASCII), то чаще всего в конце строки передается символы \n или \r или оба сразуYS писал(а):С какой радости? Коду 0x00 не соответствует ни один символ, это чисто служебный код.
Я понимаю строку в ее классическом смысле - строка символов. Если это что-то другое по идеологии, это уже не строка в ее каноническом понимании, а просто массив.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Приём строки по UART в AVR
Поскольку автор говорит о строке, то разумно предположить, что признак конца - 0х00. Тогда и ловить его и не моротить таймера. Хотя с чем там имеет дело автор на самом деле -
.
Docendo discimus
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Re: Приём строки по UART в AVR
Автор не указал что за строка у него: текстовая или числоая..
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже


