Перейти к содержанию
    

Ну дак у меня gets() и находится в блоке обработки прерывания, вызываемого при приеме очередного символа по USART!

 

INTERRUPT (SIG_USART_RCV)

{

gets();

}...

 

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

Именно посимвольно. Данные пришли - только тогда читаем. Ничего не ждем. Ваш же метод - просто ужас. Если строка не придет, а это НОРМАЛЬНАЯ ситуация при работе в реальных условиях, а не у Вас на столе, то контроллер просто повиснет. Предусматривать выход из нормальной ситуаци через сброс по собаке не надо. Плохо это и неправильно. :) И еще момент - Вы представляете время выполнения этой функции? К примеру при 9600бод и строке символов в 30? А она у Вас внутри обработчика - значит на это время все другие события(прерывания) будут отброшены.

Вот - почитайте - http://ru.wikipedia.org/wiki/Gets

Применение gets весьма осуждается. Функция оставлена в стандартах C89 и C99 для обратной совместимости. Множество инструментов разработки ПО, как например, GNU ld выдает предупреждения в случае обнаружения при компоновке кода с использованием gets.

Тут в шапке форума тема - Исходники программ и библиотек. Наверняка там есть нормальный драйвер с кольцевым буфером. Или напишите свой, там работы на пару часов. И не надо отключать ватчдог.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, соглашусь со всем! gets() "убъет" кучу времени, да и надежность никакая. Спасибо за рекомендации! :) А драйвер для считывания строки по одному символу я попробую свой сделать. Хочется разобраться до конца.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, соглашусь со всем! gets() "убъет" кучу времени, да и надежность никакая. Спасибо за рекомендации!

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

А вот по поводу символа конца строки. передавать его все равно нужно, так что лучше сохранить.

 

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

Изменено пользователем qulik

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Принимаемая строка - это условность (для универсальности программы). Принимается один символ и в зависимости от его значения принимается решение.

 

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

 

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

 

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

Изменено пользователем Xenia

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

switch ©

{

case 48: mig_led1(); break; //0

case 49: mig_led2(); break; //1

... и т.д.

}

По крайней мере не требуется сравнивать строки! Что сэкономит Flash память.

 

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

Изменено пользователем qulik

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По крайней мере не требуется сравнивать строки! Что сэкономит Flash память.

 

Когда команды примитивные (т.е. без параметров), и их число не превышает 256, то, несомненно, удобнее односимвольная кодировка - тут она самоя короткая. Но как только символов ASCII перестало хватать - приходится использовать слова, а тут уже потребуются какие-то разделители между ними: пробел, табулятор, символ конца строки и т.п.

В этой связи вспоминается фраза на манер японских хайку:

"Кончилось место на Z,

Что же мне делать теперь?

Ведь это последний..." :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще то неплохо контролировать правильность посылки. Тем более если команда в один символ. Какой нибудь CRC не помешает. Вот так по чуть чуть добавлять и... получится что то типа modbus :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Кончилось место на Z,

Что же мне делать теперь?

Ведь это последний..." :)

 

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

 

Вообще то неплохо контролировать правильность посылки. Тем более если команда в один символ. Какой нибудь CRC не помешает. Вот так по чуть чуть добавлять и... получится что то типа modbus :)

 

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

Изменено пользователем qulik

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...