Qwertty 0 19 июня, 2009 Опубликовано 19 июня, 2009 · Жалоба Ну дак у меня gets() и находится в блоке обработки прерывания, вызываемого при приеме очередного символа по USART! INTERRUPT (SIG_USART_RCV) { gets(); }... Или вы имеете ввиду посимвольно считывать строку??? Именно посимвольно. Данные пришли - только тогда читаем. Ничего не ждем. Ваш же метод - просто ужас. Если строка не придет, а это НОРМАЛЬНАЯ ситуация при работе в реальных условиях, а не у Вас на столе, то контроллер просто повиснет. Предусматривать выход из нормальной ситуаци через сброс по собаке не надо. Плохо это и неправильно. :) И еще момент - Вы представляете время выполнения этой функции? К примеру при 9600бод и строке символов в 30? А она у Вас внутри обработчика - значит на это время все другие события(прерывания) будут отброшены. Вот - почитайте - http://ru.wikipedia.org/wiki/Gets Применение gets весьма осуждается. Функция оставлена в стандартах C89 и C99 для обратной совместимости. Множество инструментов разработки ПО, как например, GNU ld выдает предупреждения в случае обнаружения при компоновке кода с использованием gets. Тут в шапке форума тема - Исходники программ и библиотек. Наверняка там есть нормальный драйвер с кольцевым буфером. Или напишите свой, там работы на пару часов. И не надо отключать ватчдог. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
qulik.13 0 20 июня, 2009 Опубликовано 20 июня, 2009 · Жалоба Да, соглашусь со всем! gets() "убъет" кучу времени, да и надежность никакая. Спасибо за рекомендации! :) А драйвер для считывания строки по одному символу я попробую свой сделать. Хочется разобраться до конца. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 20 июня, 2009 Опубликовано 20 июня, 2009 · Жалоба Да, соглашусь со всем! gets() "убъет" кучу времени, да и надежность никакая. Спасибо за рекомендации! Совсем запугали бедного Кулика :). Делать так, как он вознамерился - можно! Только никакая gets() тут не нужна, хватай символ из UDR1 - вот и вся процедура получения байта. Обычно, байтики, схваченные в прерывании кладут друг за дружкой в строку до тех пор, пока очередным байтом не окажется "конец строки" (Enter). Этот символ можно в строку не класть, а вместо этого заняться ее анализом и исполнением того, что эта строка означает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
qulik.13 0 21 июня, 2009 Опубликовано 21 июня, 2009 (изменено) · Жалоба Совсем запугали бедного Кулика :). Делать так, как он вознамерился - можно! Только никакая gets() тут не нужна, хватай символ из UDR1 - вот и вся процедура получения байта. Обычно, байтики, схваченные в прерывании кладут друг за дружкой в строку до тех пор, пока очередным байтом не окажется "конец строки" (Enter). Этот символ можно в строку не класть, а вместо этого заняться ее анализом и исполнением того, что эта строка означает. Принцип получения строки по одному символу достаточно прост. А gets() я хотел применить, что бы текст программы сократить. Но после обсуждения понял, что лучше таки по одному символу принимать. :) А вот по поводу символа конца строки. передавать его все равно нужно, так что лучше сохранить. Принимаемая строка - это условность (для универсальности программы). Примимается один символ и в зависимости от его значения принимается решение. А вот передавать по USART нужно строку. Передается она при помощи puts(). Возникает мысль передавать тоже по символу :) , но как на это среагирует копьютер? Тоже надо драйвер по прерыванию собрать, думаю справлюсь... Изменено 21 июня, 2009 пользователем qulik Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 21 июня, 2009 Опубликовано 21 июня, 2009 (изменено) · Жалоба Принимаемая строка - это условность (для универсальности программы). Принимается один символ и в зависимости от его значения принимается решение. По одному символу, как правило, принять решение не удается. Приходится прочесть слово целиком, чтобы понять, что оно означает. И вообще, символ конца строки (Enter) это не просто символ, а символ ПОДТВЕРЖДЕНИЯ того, что бы сказано. До его появления программа не имеет права начать выполнение команды, даже если смысл ее вполне понятен. Например, компьютеру нельзя выполнять "FORMAT C:" :), пока не нажат Enter. А вы вознамерились по одному символу принимать решение. А вот передавать по USART нужно строку. Передается она при помощи puts(). Возникает мысль передавать тоже по символу :) , но как на это среагирует копьютер? Тоже надо драйвер по прерыванию собрать, думаю справлюсь... Компьютеру все равно, как было передано - отдельными символами или строкой, поскольку на физическом уровне в обоих случаях прием и передача ведутся по символьно. Точно так же и AVRка получает прерывания (если их разрешить) при поступлении очередного байта, не зная того, gets'ом или getchar'ом отправлялась посылка. Изменено 21 июня, 2009 пользователем Xenia Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
qulik.13 0 24 июня, 2009 Опубликовано 24 июня, 2009 (изменено) · Жалоба По одному символу, как правило, принять решение не удается. Приходится прочесть слово целиком, чтобы понять, что оно означает. И вообще, символ конца строки (Enter) это не просто символ, а символ ПОДТВЕРЖДЕНИЯ того, что бы сказано. До его появления программа не имеет права начать выполнение команды, даже если смысл ее вполне понятен. Например, компьютеру нельзя выполнять "FORMAT C:" :), пока не нажат Enter. А вы вознамерились по одному символу принимать решение. Верно подмечено по поводу enter. Подтверждение переданного байта - это как минимум грамотно. А вот символа мне вполне достаточно для принятия решения (выбрать один из 8 вариантов): switch © { case 48: mig_led1(); break; //0 case 49: mig_led2(); break; //1 ... и т.д. } По крайней мере не требуется сравнивать строки! Что сэкономит Flash память. П.С. Посимвольный прием(передачу) я освоил. :) Изменено 24 июня, 2009 пользователем qulik Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 24 июня, 2009 Опубликовано 24 июня, 2009 · Жалоба По крайней мере не требуется сравнивать строки! Что сэкономит Flash память. Когда команды примитивные (т.е. без параметров), и их число не превышает 256, то, несомненно, удобнее односимвольная кодировка - тут она самоя короткая. Но как только символов ASCII перестало хватать - приходится использовать слова, а тут уже потребуются какие-то разделители между ними: пробел, табулятор, символ конца строки и т.п. В этой связи вспоминается фраза на манер японских хайку: "Кончилось место на Z, Что же мне делать теперь? Ведь это последний..." :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Qwertty 0 25 июня, 2009 Опубликовано 25 июня, 2009 · Жалоба Вообще то неплохо контролировать правильность посылки. Тем более если команда в один символ. Какой нибудь CRC не помешает. Вот так по чуть чуть добавлять и... получится что то типа modbus :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
qulik.13 0 25 июня, 2009 Опубликовано 25 июня, 2009 (изменено) · Жалоба "Кончилось место на Z, Что же мне делать теперь? Ведь это последний..." :) :) Ну да! Место бывает и заканчивается! Приходиться брать МК "потолще"! :)))) Вообще то неплохо контролировать правильность посылки. Тем более если команда в один символ. Какой нибудь CRC не помешает. Вот так по чуть чуть добавлять и... получится что то типа modbus :) Посмотрел про modbus в Википедии. А это интересно! Я новичек в использовании интерфейсов (да и МК тоже :))и пока кроме как SPI и RS-232 ничего не использовал. А modbus - это уже что-то! Точнее это уже протокл. Надо познакомится с ним поближе. :1111493779: Изменено 25 июня, 2009 пользователем qulik Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться