реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> WDTimer, Запустил, а как остановить?
Qwertty
сообщение Jun 19 2009, 22:51
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(qulik @ Jun 20 2009, 01:13) *
Ну дак у меня gets() и находится в блоке обработки прерывания, вызываемого при приеме очередного символа по USART!

INTERRUPT (SIG_USART_RCV)
{
gets();
}...

Или вы имеете ввиду посимвольно считывать строку???

Именно посимвольно. Данные пришли - только тогда читаем. Ничего не ждем. Ваш же метод - просто ужас. Если строка не придет, а это НОРМАЛЬНАЯ ситуация при работе в реальных условиях, а не у Вас на столе, то контроллер просто повиснет. Предусматривать выход из нормальной ситуаци через сброс по собаке не надо. Плохо это и неправильно. smile.gif И еще момент - Вы представляете время выполнения этой функции? К примеру при 9600бод и строке символов в 30? А она у Вас внутри обработчика - значит на это время все другие события(прерывания) будут отброшены.
Вот - почитайте - http://ru.wikipedia.org/wiki/Gets
Цитата
Применение gets весьма осуждается. Функция оставлена в стандартах C89 и C99 для обратной совместимости. Множество инструментов разработки ПО, как например, GNU ld выдает предупреждения в случае обнаружения при компоновке кода с использованием gets.

Тут в шапке форума тема - Исходники программ и библиотек. Наверняка там есть нормальный драйвер с кольцевым буфером. Или напишите свой, там работы на пару часов. И не надо отключать ватчдог.
Go to the top of the page
 
+Quote Post
qulik
сообщение Jun 20 2009, 21:52
Сообщение #17


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 2-04-08
Из: Санкт-Петербург
Пользователь №: 36 424



Да, соглашусь со всем! gets() "убъет" кучу времени, да и надежность никакая. Спасибо за рекомендации! smile.gif А драйвер для считывания строки по одному символу я попробую свой сделать. Хочется разобраться до конца.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jun 20 2009, 23:23
Сообщение #18


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(qulik @ Jun 21 2009, 01:52) *
Да, соглашусь со всем! gets() "убъет" кучу времени, да и надежность никакая. Спасибо за рекомендации!


Совсем запугали бедного Кулика smile.gif. Делать так, как он вознамерился - можно! Только никакая gets() тут не нужна, хватай символ из UDR1 - вот и вся процедура получения байта. Обычно, байтики, схваченные в прерывании кладут друг за дружкой в строку до тех пор, пока очередным байтом не окажется "конец строки" (Enter). Этот символ можно в строку не класть, а вместо этого заняться ее анализом и исполнением того, что эта строка означает.
Go to the top of the page
 
+Quote Post
qulik
сообщение Jun 21 2009, 12:28
Сообщение #19


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 2-04-08
Из: Санкт-Петербург
Пользователь №: 36 424



Цитата(Xenia @ Jun 21 2009, 03:23) *
Совсем запугали бедного Кулика smile.gif. Делать так, как он вознамерился - можно! Только никакая gets() тут не нужна, хватай символ из UDR1 - вот и вся процедура получения байта. Обычно, байтики, схваченные в прерывании кладут друг за дружкой в строку до тех пор, пока очередным байтом не окажется "конец строки" (Enter). Этот символ можно в строку не класть, а вместо этого заняться ее анализом и исполнением того, что эта строка означает.


Принцип получения строки по одному символу достаточно прост. А gets() я хотел применить, что бы текст программы сократить. Но после обсуждения понял, что лучше таки по одному символу принимать. smile.gif
А вот по поводу символа конца строки. передавать его все равно нужно, так что лучше сохранить.

Принимаемая строка - это условность (для универсальности программы). Примимается один символ и в зависимости от его значения принимается решение. А вот передавать по USART нужно строку. Передается она при помощи puts(). Возникает мысль передавать тоже по символу smile.gif , но как на это среагирует копьютер? Тоже надо драйвер по прерыванию собрать, думаю справлюсь...

Сообщение отредактировал qulik - Jun 21 2009, 12:29
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jun 21 2009, 13:58
Сообщение #20


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(qulik @ Jun 21 2009, 16:28) *
Принимаемая строка - это условность (для универсальности программы). Принимается один символ и в зависимости от его значения принимается решение.


По одному символу, как правило, принять решение не удается. Приходится прочесть слово целиком, чтобы понять, что оно означает. И вообще, символ конца строки (Enter) это не просто символ, а символ ПОДТВЕРЖДЕНИЯ того, что бы сказано. До его появления программа не имеет права начать выполнение команды, даже если смысл ее вполне понятен. Например, компьютеру нельзя выполнять "FORMAT C:" smile.gif, пока не нажат Enter. А вы вознамерились по одному символу принимать решение.

Цитата(qulik @ Jun 21 2009, 16:28) *
А вот передавать по USART нужно строку. Передается она при помощи puts(). Возникает мысль передавать тоже по символу smile.gif , но как на это среагирует копьютер? Тоже надо драйвер по прерыванию собрать, думаю справлюсь...


Компьютеру все равно, как было передано - отдельными символами или строкой, поскольку на физическом уровне в обоих случаях прием и передача ведутся по символьно. Точно так же и AVRка получает прерывания (если их разрешить) при поступлении очередного байта, не зная того, gets'ом или getchar'ом отправлялась посылка.

Сообщение отредактировал Xenia - Jun 21 2009, 13:59
Go to the top of the page
 
+Quote Post
qulik
сообщение Jun 24 2009, 17:06
Сообщение #21


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 2-04-08
Из: Санкт-Петербург
Пользователь №: 36 424



Цитата(Xenia @ Jun 21 2009, 17:58) *
По одному символу, как правило, принять решение не удается. Приходится прочесть слово целиком, чтобы понять, что оно означает. И вообще, символ конца строки (Enter) это не просто символ, а символ ПОДТВЕРЖДЕНИЯ того, что бы сказано. До его появления программа не имеет права начать выполнение команды, даже если смысл ее вполне понятен. Например, компьютеру нельзя выполнять "FORMAT C:" smile.gif, пока не нажат Enter. А вы вознамерились по одному символу принимать решение.


Верно подмечено по поводу enter. Подтверждение переданного байта - это как минимум грамотно. А вот символа мне вполне достаточно для принятия решения (выбрать один из 8 вариантов):

switch ©
{
case 48: mig_led1(); break; //0
case 49: mig_led2(); break; //1
... и т.д.
}
По крайней мере не требуется сравнивать строки! Что сэкономит Flash память.

П.С. Посимвольный прием(передачу) я освоил. smile.gif

Сообщение отредактировал qulik - Jun 24 2009, 17:07
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jun 24 2009, 23:11
Сообщение #22


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(qulik @ Jun 24 2009, 21:06) *
По крайней мере не требуется сравнивать строки! Что сэкономит Flash память.


Когда команды примитивные (т.е. без параметров), и их число не превышает 256, то, несомненно, удобнее односимвольная кодировка - тут она самоя короткая. Но как только символов ASCII перестало хватать - приходится использовать слова, а тут уже потребуются какие-то разделители между ними: пробел, табулятор, символ конца строки и т.п.
В этой связи вспоминается фраза на манер японских хайку:
"Кончилось место на Z,
Что же мне делать теперь?
Ведь это последний..." smile.gif
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jun 25 2009, 01:40
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Вообще то неплохо контролировать правильность посылки. Тем более если команда в один символ. Какой нибудь CRC не помешает. Вот так по чуть чуть добавлять и... получится что то типа modbus smile.gif
Go to the top of the page
 
+Quote Post
qulik
сообщение Jun 25 2009, 17:08
Сообщение #24


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 2-04-08
Из: Санкт-Петербург
Пользователь №: 36 424



Цитата(Xenia @ Jun 25 2009, 03:11) *
"Кончилось место на Z,
Что же мне делать теперь?
Ведь это последний..." smile.gif


smile.gif Ну да! Место бывает и заканчивается! Приходиться брать МК "потолще"! smile.gif)))

Цитата(Qwertty @ Jun 25 2009, 05:40) *
Вообще то неплохо контролировать правильность посылки. Тем более если команда в один символ. Какой нибудь CRC не помешает. Вот так по чуть чуть добавлять и... получится что то типа modbus smile.gif


Посмотрел про modbus в Википедии. А это интересно! Я новичек в использовании интерфейсов (да и МК тоже smile.gif)и пока кроме как SPI и RS-232 ничего не использовал. А modbus - это уже что-то! Точнее это уже протокл. Надо познакомится с ним поближе. 1111493779.gif

Сообщение отредактировал qulik - Jun 25 2009, 17:08
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th June 2025 - 16:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01442 секунд с 7
ELECTRONIX ©2004-2016