|
SIM900. Прием команд от TCP сервера., Как исключить коллизии в порту при приеме внешних команд? |
|
|
|
Apr 22 2014, 16:50
|
Участник

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

|
Здравствуйте!
Разрабатываю устройство, которое собирает различные данные с датчиков и с периодичностью в одну минуту отправляет их на сервер посредством SIM900. Использую обычный режим AT-команд, не transparent, то есть команда AT+CIPSEND, приходит приглашение ">", отсылаю в порт строку, дожидаюсь SEND OK, всё. В данный момент добился надежной отсылки данных. Встал вопрос приёма команд от сервера. Все в общем, работает, за исключением случая, когда микроконтроллер ждет ответа от SIM900 и в этот момент приходит команда от сервера. Аппаратное управление потоком в этом случае вряд ли подойдет.. Подскажите, пожалуйста, кто как справился с этой проблемой?
|
|
|
|
|
 |
Ответов
|
Apr 23 2014, 15:21
|
Участник

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

|
Цитата(zebrox @ Apr 23 2014, 21:18)  И почему конец сообщения определяется таймаутом? Почему не использовать последовательность CR LF? Потому что встречаются ответы модема, в которых есть и две последовательности CR LF, и три.
|
|
|
|
|
Apr 25 2014, 08:29
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(Иван Плетнев @ Apr 23 2014, 21:21)  Потому что встречаются ответы модема, в которых есть и две последовательности CR LF, и три. Самое первое правило - обрабатывать ВСЕ!!! последовательности от модема. Второе - последовательность AT команд четко регламетирована (см GSM 07.07 раздел 4). Заметьте, у всех команд стандарта есть final result code (чего не скажешь творчестве собственных расширений производителей модемов) Все что между - результат выполения команды. И еще есть ансинхронные ответы. Могут влезть куда угодно. либо пропускайте их, либо применяйте. НО РАСПОЗНАТЬ их надо!!
|
|
|
|
|
Apr 25 2014, 08:42
|
Частый гость
 
Группа: Участник
Сообщений: 143
Регистрация: 27-02-14
Из: Москва
Пользователь №: 80 728

|
Цитата(Alechek @ Apr 25 2014, 12:29)  Самое первое правило - обрабатывать ВСЕ!!! последовательности от модема.
Второе - последовательность AT команд четко регламетирована (см GSM 07.07 раздел 4). Заметьте, у всех команд стандарта есть final result code (чего не скажешь творчестве собственных расширений производителей модемов) Все что между - результат выполения команды.
И еще есть ансинхронные ответы. Могут влезть куда угодно. либо пропускайте их, либо применяйте. НО РАСПОЗНАТЬ их надо!! Однозначно! Все прочее (кроме автомата) - просто мертвому припарки. Выкрутиться не получится. Кстати, у оператора case в любом "языковом исполнении" всегда имеется свой else, позволяющий пропустить что-угодно как с распознаванием, так и без, если со стороны пришел некий "невнятный" и не вписывающийся в рамки протокола ответ - команда вместо данных и в таком духе.
--------------------
|
|
|
|
|
Apr 27 2014, 16:21
|
Участник

Группа: Участник
Сообщений: 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, но не по незапрашиваемому ответу, а по запросу. Мне как раз мультисокет и не нужен, мне достаточно одного соединения. Значит ли это, что мне лучше воспользоваться прозрачным режимом? И второе. Намекните, если можно, про устройство Вашего оптимизированного парсера. Как он работает?
|
|
|
|
|
Apr 28 2014, 06:28
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 28 2014, 09:14
|
Частый гость
 
Группа: Участник
Сообщений: 121
Регистрация: 17-04-09
Пользователь №: 47 838

|
Цитата(alexdos @ Apr 28 2014, 08:28)  ...Единственное что портит всю картину это приглашение к вводу данных "> "... Жду 1 сек, и подразумеваю, что пришло приглашение. Не видел ситуации, когда бы приглашение не пришло при отправке смса. А при передаче данных, мне мой сервер подтверждает получение посылки. Немного сложно обрабатывать ответы, которые не содержат заголовка (чтение имей).
|
|
|
|
|
Apr 28 2014, 10:28
|
Местный
  
Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856

|
Цитата(zebrox @ Apr 28 2014, 12:14)  Жду 1 сек, и подразумеваю, что пришло приглашение. Не видел ситуации, когда бы приглашение не пришло при отправке смса. А при передаче данных, мне мой сервер подтверждает получение посылки.
Немного сложно обрабатывать ответы, которые не содержат заголовка (чтение имей). Аж целую секунду, я не могу позволить себе столько ждать. В случае с \r\n никаких сложностей.
|
|
|
|
Сообщений в этой теме
Иван Плетнев 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|