|
|
 |
Ответов
|
Nov 7 2008, 22:23
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(david_off @ Nov 7 2008, 13:19)  В моей программе все сообщения обрабатываются по установке флага получения нового сообщения. Анализатор флага работает так: получив CRLF (начало) - начинает ожидать CRLF(конец). Как только получен конец - флаг устанавливается. Обработчик сообщений, получив флаг, смотрит в буфер и обрабатывает пришедшее сообщение. После обработки флаг сбрасывается. А я так и не пойму, как при таком алгоритме можно принимать не только сообщения модема, но еще и данные, которые сыпятся по GPRS-у (или по CSD). Я уже писал об этом тут рядом. У меня основа алгоритма - кольцевой приемный буфер достаточного размера, чтобы разместить мах возможный пакет данных + несколько ответов модема, включая незапрашиваемые (unsolicited). Признак получения данных - таймаут (дырка в данных) в ~50ms После чего начинает работать обработчик по разбору всего, что пришло (причем в это время могут начинать валится новые данные, они попадут дальше в кольцевой буфер и будут обработаны позднее) Обработчик сверяет по шаблону все нужные ответы. Если ответ найден, он стирается, если нет, то ожидаются еще данные в пределах максимального времени ожидания ответа на данную команду (эти времена у меня разные для разных команд, мах несколько минут). Если за это время ожидания не обнаружено требуемых в данном месте ответов, то обработчик выдает ошибку, весь приемный буфер очищается и продвигаемся далее по алгоритму обработки ошибок. Тут имейте в виду, что ответы модема не только часто состоят из нескольких строчек, но и еще в разных условиях они могут менять свой порядок.  Я как-то об этом писал. Еще добавлю, что работать с модемом без операционки я не рискую, уж больно большой гемор Правда, я сам полноценную ОС не использую, а применяю ее зачаток, где кроме главного цикла и прерываний есть еще один поток, в котором выполняются модемные процедуры и можно применять "ожидания событий", во время которых крутится главный цикл (ну и прерывания ессно)
|
|
|
|
|
Nov 8 2008, 13:00
|
Участник

Группа: Новичок
Сообщений: 37
Регистрация: 15-10-08
Из: Одесса, Украина
Пользователь №: 40 978

|
Цитата(Baser @ Nov 8 2008, 02:23)  А я так и не пойму, как при таком алгоритме можно принимать не только сообщения модема, но еще и данные, которые сыпятся по GPRS-у (или по CSD). Я уже писал об этом тут рядом. Не знаю что у вас за железо, но я это реализую на mega128+SIM300C. Чего то для этой парочки не слышал про какую-то ось. Что касается алгоритма обработки, то мой алгоритм отлично работал, до появления сообщения REMOTE IP и данных GPRS. Ведь именно по этому я и создал эту тему. Тут мне подсказали сделать таймауты. После их добавления наши с вами алгоритмы стали практически близнецами. Сами судите. У меня тот же кольцевой буфер. Размер его выбран по такому же принципу. Байты ловятся в прерывании по приёму USART. Там же стоит логика, которая отслеживает появления LF по принципу StateMachine. Появилось LF дважды (пока таймер ещё не сработал) - значит в буфере уже лежит что-то осмысленное и можно это обработать. Для всех используемых мною команд можно это использовать. При появлении команд, которые в конце не имеют LF - обработку инициирует срабатывание таймера. После начала обработки, StateMachine возращается в начальное состояние, что бы начинать отлов новых ответов с "нового листа". Сам же принцип обработки тоже очень похож. Идём по буферу, сравниваем его содержимое с готовыми шаблонами ответа. Определённые ответы выставляют особые флаги. Например нашли OK - ставим OKfound = true. Если в буфере встречается ERROR или ему подобные, то ставиться ERRORfound=true. Если не нашли нужного шаблона - значит это просто ответ - для него есть флаг ANSWERfound. Когда есть три таких флага, то после посылки любой комады нужно дождаться либо экстернного вываливания (ERRORfound) либо нужного сочетания ANSWERfound и OKfound. После того как в буфере обработана инфа, он так же чистится, как и у вас. Перед посылкой новой команды, все флаги сбрасываются. Может это и покажется диким, но у меня как ни странно всё класно работает. Проверял, тестил сутки - сбоев не было. Отработаны команды поднятия GPRS сервиса, инициализации и приёма звонков, посылки и приёма TCP сообщений. Алгоритм обработки не падает при вклинивании UNSOLICITED сообщений типа RING или +CMTI. При появлении их появлении, они обрабатываеются, затем в буфере происходит откат указателей и программа продолжает корректное ожидание или обработку прерванной комады - все ок. Цитата(@Ark @ Nov 8 2008, 04:14)  А Вы не пробовали действовать методом исключения? Получив первый символ, после LF, Вы сразу "отсекаете" из набора возможных сообщений все, начинающиеся с другого символа. Очень часто, после приема первых двух-трех-четырех символов, остается только один возможный вариант ответа. С этого момента, уже можно считать сообщение принятым - выставить флаг, определить код сообщения и переключиться на ожидание следующего LF. C какой задержкой придет оставшаяся часть ответа и завершающий LF (или LF нового сообщения) - уже не будет иметь значения. Прием сообщения еще не окончен, но его обработка уже завершена... P.S. Конечно, этот алгоритм не отменяет необходимость обработки таймаутов. Пробовал, но программа получается дико несмотрибельной. При достаточном количестве команд, появлеются дикие деревья вложенных IF, Количество внеших IF стремится к размеру алфавита, а внутренних при одинаковых первых символах, также прибаляет новые внутренние ветки. В итоге скорость не на много повышается, а писать не удобно. Единственное, что я сделал для ускорения, это считаю длину полученной посылки во время приёма. Процесс сравнивания сначала пытается найти похожий шаблона ответа в ответах фиксированной длины (OK, ERROR, CONNECT ...), если же после попадания в раздел нужной длины соответвий не найдено, то идем в раздел ответов неопределённой длины (+IPD, REMOTE IP: ...). Если и там ответ не найден, то получен не шаблонный ответ, который будет обработан по индивидуальному алгоритму для каждой нестандартной комады. Мне кажется более гуманно. Даём модему нормально высказаться, потом поднимаем RTS и спокойно обработать полученный ответ. А в вашем алгоритме получается не намного быстрее, но вы тем самым не даёте модему свободно выражаться. Ведь наверняка, если обработка ответа идёт во время получения, то возможно, что контроллер будет не готов к продолжению приёма к моменту получения нового байта.
Сообщение отредактировал david_off - Nov 8 2008, 13:03
|
|
|
|
|
Nov 8 2008, 13:45
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(david_off @ Nov 8 2008, 15:00)  Не знаю что у вас за железо, но я это реализую на mega128+SIM300C. Чего то для этой парочки не слышал про какую-то ось. Ну, если люди умудряются в PIC-и с 8-ю килограммами памяти запихивать маленькие ОСьки, то в mega128 можно применить любую из доступных для МК  Здесь в конфе много инфы по этому вопросу. Но да ладно, это уже отход от существа вопроса. Просто, именно столкнувшись когда-то с задачей управлением модемом, я понял все прелести наличия ОСи, когда передача данных через модем - это только одна из N-цати задач, которые нужно решать одновременно.
|
|
|
|
|
Nov 8 2008, 15:47
|
Участник

Группа: Новичок
Сообщений: 37
Регистрация: 15-10-08
Из: Одесса, Украина
Пользователь №: 40 978

|
Цитата(Baser @ Nov 8 2008, 17:45)  Ну, если люди умудряются в PIC-и с 8-ю килограммами памяти запихивать маленькие ОСьки, то в mega128 можно применить любую из доступных для МК  Здесь в конфе много инфы по этому вопросу. Но да ладно, это уже отход от существа вопроса. Просто, именно столкнувшись когда-то с задачей управлением модемом, я понял все прелести наличия ОСи, когда передача данных через модем - это только одна из N-цати задач, которые нужно решать одновременно. Не знал что под мой зверёк тоже есть оси. Я думал оси пишут только для DSP и выше. Поищу. Может быть жить станет красивей. Кстати будет ещё интересно пару слов о ваших предпочтениях в этом вопросе. Наверняка будет много разных вариантов, львиную долю которых вы уже забраковали и лишите меня приятного права наткнулся на уже пройденные грабли. PS: cпасибо за просвящение.
|
|
|
|
|
Nov 8 2008, 17:19
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(david_off @ Nov 8 2008, 17:47)  Кстати будет ещё интересно пару слов о ваших предпочтениях в этом вопросе. Наверняка будет много разных вариантов, львиную долю которых вы уже забраковали и лишите меня приятного права наткнулся на уже пройденные грабли. Извиняйте, тут я вам не советчик. Все времени нет плотно за это взяться Обычно, когда появляется подходящая задача, уже разбираться поздно - "нужно работу работать". В нескольких проектах применяю то, о чем писал выше. Почитайте эти ветки, судя по тому, что эти три RTOS выделили в отдельные подфорумы, они самые популярные среди местной братии
|
|
|
|
Сообщений в этой теме
david_off Как обрабатывать сообщение REMOTE IP: Nov 7 2008, 11:19 FormatCft Цитата(david_off @ Nov 7 2008, 16:19) В м... Nov 7 2008, 11:28 _zag_ Цитата(FormatCft @ Nov 7 2008, 15:28) ИМХ... Nov 7 2008, 11:49 PIC_Embedder У меня получилось что-то среднее. Алгоритм такой. ... Nov 7 2008, 12:31 david_off Цитата(PIC_Embedder @ Nov 7 2008, 16:31) ... Nov 7 2008, 12:38  _zag_ Цитата(david_off @ Nov 7 2008, 16:38) неп... Nov 7 2008, 13:54   david_off Думал, думал и надумал...
По суте у меня выбор ме... Nov 7 2008, 16:24    @Ark Цитата(david_off @ Nov 7 2008, 19:24) Дум... Nov 7 2008, 17:11     david_off Цитата(@Ark @ Nov 7 2008, 21:11) Предложу... Nov 7 2008, 18:30      @Ark Цитата(david_off @ Nov 7 2008, 21:30) Вы ... Nov 7 2008, 18:53       david_off Цитата(@Ark @ Nov 7 2008, 22:53) Здесь, к... Nov 7 2008, 20:00        @Ark Цитата(david_off @ Nov 7 2008, 23:00) Нав... Nov 8 2008, 00:14  PIC_Embedder Цитата(david_off @ Nov 7 2008, 16:38) неп... Nov 7 2008, 15:40  @Ark Цитата(david_off @ Nov 8 2008, 16:00) ...... Nov 8 2008, 13:23 FormatCft Цитата(Baser @ Nov 8 2008, 03:23) А я так... Nov 9 2008, 10:18  Baser Цитата(FormatCft @ Nov 9 2008, 12:18) А п... Nov 9 2008, 16:38
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|