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

 
 
> SIM900. Прием команд от TCP сервера., Как исключить коллизии в порту при приеме внешних команд?
Иван Плетнев
сообщение Apr 22 2014, 16:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 12-04-14
Пользователь №: 81 340



Здравствуйте!

Разрабатываю устройство, которое собирает различные данные с датчиков и с периодичностью в одну минуту отправляет их на сервер посредством SIM900. Использую обычный режим AT-команд, не transparent, то есть команда AT+CIPSEND, приходит приглашение ">", отсылаю в порт строку, дожидаюсь SEND OK, всё. В данный момент добился надежной отсылки данных. Встал вопрос приёма команд от сервера. Все в общем, работает, за исключением случая, когда микроконтроллер ждет ответа от SIM900 и в этот момент приходит команда от сервера. Аппаратное управление потоком в этом случае вряд ли подойдет..
Подскажите, пожалуйста, кто как справился с этой проблемой?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zebrox
сообщение Apr 23 2014, 13:18
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 17-04-09
Пользователь №: 47 838



И почему конец сообщения определяется таймаутом?
Почему не использовать последовательность CR LF?
Go to the top of the page
 
+Quote Post
Иван Плетнев
сообщение Apr 23 2014, 15:21
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 12-04-14
Пользователь №: 81 340



Цитата(zebrox @ Apr 23 2014, 21:18) *
И почему конец сообщения определяется таймаутом?
Почему не использовать последовательность CR LF?

Потому что встречаются ответы модема, в которых есть и две последовательности CR LF, и три.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Apr 25 2014, 08:29
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(Иван Плетнев @ Apr 23 2014, 21:21) *
Потому что встречаются ответы модема, в которых есть и две последовательности CR LF, и три.

Самое первое правило - обрабатывать ВСЕ!!! последовательности от модема.

Второе - последовательность AT команд четко регламетирована (см GSM 07.07 раздел 4).
Заметьте, у всех команд стандарта есть final result code (чего не скажешь творчестве собственных расширений производителей модемов)
Все что между - результат выполения команды.

И еще есть ансинхронные ответы. Могут влезть куда угодно. либо пропускайте их, либо применяйте. НО РАСПОЗНАТЬ их надо!!
Go to the top of the page
 
+Quote Post
tdocs.su
сообщение Apr 25 2014, 08:42
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 143
Регистрация: 27-02-14
Из: Москва
Пользователь №: 80 728



Цитата(Alechek @ Apr 25 2014, 12:29) *
Самое первое правило - обрабатывать ВСЕ!!! последовательности от модема.

Второе - последовательность AT команд четко регламетирована (см GSM 07.07 раздел 4).
Заметьте, у всех команд стандарта есть final result code (чего не скажешь творчестве собственных расширений производителей модемов)
Все что между - результат выполения команды.

И еще есть ансинхронные ответы. Могут влезть куда угодно. либо пропускайте их, либо применяйте. НО РАСПОЗНАТЬ их надо!!

Однозначно! Все прочее (кроме автомата) - просто мертвому припарки. Выкрутиться не получится.
Кстати, у оператора case в любом "языковом исполнении" всегда имеется свой else, позволяющий пропустить что-угодно как с распознаванием, так и без, если со стороны пришел некий "невнятный" и не вписывающийся в рамки протокола ответ - команда вместо данных и в таком духе.


--------------------
Go to the top of the page
 
+Quote Post
Иван Плетнев
сообщение Apr 27 2014, 16:21
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 12-04-14
Пользователь №: 81 340



Цитата(tdocs.su @ Apr 25 2014, 16:42) *
Однозначно! Все прочее (кроме автомата) - просто мертвому припарки. Выкрутиться не получится.
Кстати, у оператора case в любом "языковом исполнении" всегда имеется свой else, позволяющий пропустить что-угодно как с распознаванием, так и без, если со стороны пришел некий "невнятный" и не вписывающийся в рамки протокола ответ - команда вместо данных и в таком духе.

Немного не понял про else. Что Вы имеете ввиду?

Цитата(zebrox @ Apr 25 2014, 23:24) *
Тоже сначала делал обработку по таймауту.
Все было очень плохо.

Потом перешел на обработку по концу строки.
По приходу строки выставляю сигнал ртс, в основном цикле обрабатываю строку, убираю ртс когда процессор готов к приему.
Имею проблему только с командой чтения имея, т.к. имей возвращается во второй строке и без заголовка.
В этом случае обрабатываю второую строку и проверяю что-бы ее длинна была 14 символов.
При этом эхо включено, и оно не мешает процессору вылавливать необходимые ответы.

Кстати, вот что хотел спросить. Если мы выставляем ртс, и за это время в буфере SIM900 накопится, например, три сообщения, то, когда мы отпустим ртс, они вывалятся все разом, без пауз между ними?

Цитата(Alechek @ Apr 25 2014, 16:29) *
Самое первое правило - обрабатывать ВСЕ!!! последовательности от модема.

Второе - последовательность AT команд четко регламетирована (см GSM 07.07 раздел 4).
Заметьте, у всех команд стандарта есть final result code (чего не скажешь творчестве собственных расширений производителей модемов)
Все что между - результат выполения команды.

И еще есть ансинхронные ответы. Могут влезть куда угодно. либо пропускайте их, либо применяйте. НО РАСПОЗНАТЬ их надо!!

Я всё понимаю, и стараюсь учесть все возможные ответы от модема. Но если пытаться определять конец посылки по CR/LF, учитывая то, что CR/LF может быть несколько, например \r\nOK\r\nблаблабла\r\n, то нам как минимум нужно знать, сколько \r\n будет в ответе от модема. Посчитать их, конечно, легко, но если асинхронное сообщение появилось, с ним как быть? Направьте меня в нужную сторону. Вообще, конечно, то, что форматы ответов так разнятся от команды к команде, сильно осложняет их обработку и даже немного раздражает.

Что до меня, то пока особых трудностей с определением конца посылки по таймауту не возникало. Работает достаточно надежно. Кстати, снизил длительность таймаута до 1мс., пока полет нормальный.

Кстати, по поводу собственно сабжа. У меня трудности, описанные в первом посте этой темы возникали в основном из-за ошибки переполнения буфера UART, связанной с отключением прерываний в другом, параллельном процессе. Так что проблема, можно сказать, почти решена. Сейчас тестирую прозрачный режим, обсуждение в соседней теме . Буду рад выслушать Ваши мнения.

Цитата(RadikX @ Apr 25 2014, 13:59) *
Это как раз не страшно. У меня идет работа с голосом (прием звонка, дозвон), SMS (прием и отправка) и GPRS (клиент) , плюс полный набор обслуживающих команд и всего в сумме получается не более 60 вариантов заголовков команд/ответов. Если делать не побуквенное сравнение, а более оптимизированный парсер, то получается быстрое автоматическое определение что пришло. Но с GPRS, да, в непрозрачном режиме приходится выкручиваться, а в прозрачном нет мультисокетов. Как вариант - реализовать режим мультиплексирования (CMUX).
Было бы очень удобно, если бы китайцы добавили аналог +CIPRXGET, но не по незапрашиваемому ответу, а по запросу.

Мне как раз мультисокет и не нужен, мне достаточно одного соединения. Значит ли это, что мне лучше воспользоваться прозрачным режимом?
И второе. Намекните, если можно, про устройство Вашего оптимизированного парсера. Как он работает?
Go to the top of the page
 
+Quote Post
alexdos
сообщение Apr 28 2014, 06:28
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856



Цитата(Иван Плетнев @ Apr 27 2014, 19:21) *
Я всё понимаю, и стараюсь учесть все возможные ответы от модема. Но если пытаться определять конец посылки по CR/LF, учитывая то, что CR/LF может быть несколько, например \r\nOK\r\nблаблабла\r\n, то нам как минимум нужно знать, сколько \r\n будет в ответе от модема. Посчитать их, конечно, легко, но если асинхронное сообщение появилось, с ним как быть? Направьте меня в нужную сторону. Вообще, конечно, то, что форматы ответов так разнятся от команды к команде, сильно осложняет их обработку и даже немного раздражает.

Что до меня, то пока особых трудностей с определением конца посылки по таймауту не возникало. Работает достаточно надежно. Кстати, снизил длительность таймаута до 1мс., пока полет нормальный.

Тоже определял конец строки по таймауту. Работало.
Потом перешел по \r\n. По \r\n оказалось более работоспособно, и нет никакой необходимости в знании сколько их будет в ответе. К примеру посмотрим на строку \r\nOK\r\nблаблабла\r\n, по первому \n мы видим что это начало строки (так как количество принятых байтов равно 2). По второму получаем ответ OK. По третьему получаем ответ блаблабла. Поэтому при разборе ответов, задача сводится к проверке "наборов байтов находящихся между \r\n". Единственное что портит всю картину это приглашение к вводу данных "> ", но и это обходится очень просто.

Сообщение отредактировал alexdos - Apr 28 2014, 07:10
Go to the top of the page
 
+Quote Post
zebrox
сообщение Apr 28 2014, 09:14
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 17-04-09
Пользователь №: 47 838



Цитата(alexdos @ Apr 28 2014, 08:28) *
...Единственное что портит всю картину это приглашение к вводу данных "> "...


Жду 1 сек, и подразумеваю, что пришло приглашение. Не видел ситуации, когда бы приглашение не пришло при отправке смса.
А при передаче данных, мне мой сервер подтверждает получение посылки.

Немного сложно обрабатывать ответы, которые не содержат заголовка (чтение имей).
Go to the top of the page
 
+Quote Post
alexdos
сообщение Apr 28 2014, 10:28
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856



Цитата(zebrox @ Apr 28 2014, 12:14) *
Жду 1 сек, и подразумеваю, что пришло приглашение. Не видел ситуации, когда бы приглашение не пришло при отправке смса.
А при передаче данных, мне мой сервер подтверждает получение посылки.

Немного сложно обрабатывать ответы, которые не содержат заголовка (чтение имей).

Аж целую секунду, я не могу позволить себе столько ждать.
В случае с \r\n никаких сложностей.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Иван Плетнев   SIM900. Прием команд от TCP сервера.   Apr 22 2014, 16:50
- - zebrox   Так понимаю, что процессор ожидает ответ от сима н...   Apr 22 2014, 21:40
|- - Иван Плетнев   Цитата(zebrox @ Apr 23 2014, 05:40) Так п...   Apr 23 2014, 03:57
- - V_G   Таймаут приема (большой) использую только для защи...   Apr 23 2014, 04:56
- - tdocs.su   Автомат конечный писать надо. Были проблемы когда-...   Apr 23 2014, 05:15
|- - Иван Плетнев   Цитата(tdocs.su @ Apr 23 2014, 13:15) Авт...   Apr 23 2014, 05:57
- - tdocs.su   Как-то странно... Ведь в автомате после отправки ч...   Apr 23 2014, 06:19
|- - Иван Плетнев   Цитата(tdocs.su @ Apr 23 2014, 14:19) Как...   Apr 23 2014, 06:27
|- - tdocs.su   Цитата(Иван Плетнев @ Apr 23 2014, 10:27)...   Apr 23 2014, 06:54
- - Иван Плетнев   Все-таки не получается у меня в стандартном, коман...   Apr 23 2014, 09:50
|- - tdocs.su   Цитата(Иван Плетнев @ Apr 23 2014, 13:50)...   Apr 23 2014, 13:08
|- - Lotor   Цитата(alexdos @ Apr 28 2014, 10:28) Един...   Apr 28 2014, 12:38
|- - alexdos   Цитата(Lotor @ Apr 28 2014, 15:38) А как ...   Apr 28 2014, 14:56
- - RadikX   Цитата(Иван Плетнев @ Apr 23 2014, 19:21)...   Apr 25 2014, 05:59
- - zebrox   Тоже сначала делал обработку по таймауту. Все было...   Apr 25 2014, 15:24
- - zebrox   После снятия ртса сим выдаст следующую строку, про...   Apr 27 2014, 22:46
|- - tdocs.su   Цитата(zebrox @ Apr 28 2014, 02:46) Если ...   Apr 28 2014, 06:11
|- - Иван Плетнев   Цитата(tdocs.su @ Apr 28 2014, 14:11) Не-...   Apr 28 2014, 15:38
|- - alexdos   Цитата(Иван Плетнев @ Apr 28 2014, 18:38)...   Apr 28 2014, 17:45
- - Alechek   Добавлю еще, что большинство ответов можно расматр...   Apr 28 2014, 05:38
- - tdocs.su   Лексема (Lexical) token Lexical unit - Языковая ко...   Apr 28 2014, 06:49
- - zebrox   Блокируется только машина юарта, она переходит в с...   Apr 28 2014, 10:46
- - zebrox   Я думаю. В прерывании прихода символа из юарта, пр...   Apr 28 2014, 13:14
|- - Lotor   Цитата(zebrox @ Apr 28 2014, 17:14) В пре...   Apr 28 2014, 13:33
- - zebrox   Юарт у это разделяемый ресурс. Доступом к нему упр...   Apr 28 2014, 14:13
- - RadikX   Цитата(Иван Плетнев @ Apr 27 2014, 20:21)...   Apr 29 2014, 04:07
- - tdocs.su   Вспомнил. Делал еще какую-то буферизацию для хвост...   Apr 29 2014, 04:14
- - Lotor   Цитата(tdocs.su @ Apr 29 2014, 08:14) Всп...   Apr 30 2014, 10:46


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

 


RSS Текстовая версия Сейчас: 18th August 2025 - 02:59
Рейтинг@Mail.ru


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