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

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

|
Здравствуйте!
Разрабатываю устройство, которое собирает различные данные с датчиков и с периодичностью в одну минуту отправляет их на сервер посредством SIM900. Использую обычный режим AT-команд, не transparent, то есть команда AT+CIPSEND, приходит приглашение ">", отсылаю в порт строку, дожидаюсь SEND OK, всё. В данный момент добился надежной отсылки данных. Встал вопрос приёма команд от сервера. Все в общем, работает, за исключением случая, когда микроконтроллер ждет ответа от SIM900 и в этот момент приходит команда от сервера. Аппаратное управление потоком в этом случае вряд ли подойдет.. Подскажите, пожалуйста, кто как справился с этой проблемой?
|
|
|
|
|
 |
Ответов
|
Apr 27 2014, 22:46
|
Частый гость
 
Группа: Участник
Сообщений: 121
Регистрация: 17-04-09
Пользователь №: 47 838

|
После снятия ртса сим выдаст следующую строку, проц выставит ртс, обработает ее, уберет ртс и так до тех пор, пока сим все строки не выдаст.
Большинство сообщений от сима имею заголовок, +IPR например. В програме заданы все заголовки на которые надо реагировать. Если в пришедшей строке найден один из заголовков, то проц уходит в его обработчик, который знает в какой что читать. ОК и ЕРРОР так-же определены как заголовки. При их приходе проверяется проверяется последняя переданная команда (храню условный номер). Если на эту команду ответ должен быть ОК, а пришел ЕРРОР, то снова передаю ту команду. Если пришел ОК то переход к слудующей команде. Это уже обычная машина сосостояний.
|
|
|
|
|
Apr 28 2014, 06:11
|
Частый гость
 
Группа: Участник
Сообщений: 143
Регистрация: 27-02-14
Из: Москва
Пользователь №: 80 728

|
Цитата(zebrox @ Apr 28 2014, 02:46)  Если пришел ОК то переход к слудующей команде. Это уже обычная машина сосостояний. Не-а. Надо сначала "пропихнуть" автомат в следующее состояние, которое будет ждать прихода именно Ок. Цитата Немного не понял про else. Что Вы имеете ввиду? Вот - http://www.delphisources.ru/forum/showthread.php?t=6547 Обратите внимание, что case намного прозрачнее if. Но это его удобство, проще читать код, все видно хорошо. А ссылку на статью давал, там есть рисунки с кодами автомата. Для возвртата в исходное состояние используется оператор goto. И под каждым case устанавливается следующее состояние. Короче, все просто оказалось, но намучился с этим всем конкретно, когда шел не автоматным путем.
--------------------
|
|
|
|
|
Apr 28 2014, 15:38
|
Участник

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

|
Цитата(tdocs.su @ Apr 28 2014, 14:11)  Не-а. Надо сначала "пропихнуть" автомат в следующее состояние, которое будет ждать прихода именно Ок. Вот - http://www.delphisources.ru/forum/showthread.php?t=6547 Обратите внимание, что case намного прозрачнее if. Но это его удобство, проще читать код, все видно хорошо. А ссылку на статью давал, там есть рисунки с кодами автомата. Для возвртата в исходное состояние используется оператор goto. И под каждым case устанавливается следующее состояние. Короче, все просто оказалось, но намучился с этим всем конкретно, когда шел не автоматным путем. Да я ж говорю, что тоже на автоматах всё у меня Код case 0: ExtraBufferCopyFlag = 1; //флаг копирования нужного фрагмента буфера (со смещением) send_command0(CIPSTATUS); gprsstate++; response_timeout=2000; break; case 1: if (!response_wait) { //если дождались ответа switch (response_code) { case 15: // INITIAL STATE gprsstate++; ready_to_send=0; break; case 17: // PDP DEACT STATE (Отключен сетью) gprsstate = 100; //закрываем все подключения ready_to_send=0; break; case 16: //TCP CLOSED gprsstate = 12; // gsm_delay=300; ready_to_send=0; break; case 18: //CONNECT OK gprsstate = 20; send_flag=1; break; case 20: //CONNECTING gprsstate = 30; break; case 3: gprsstate=30; break; } } Ну и так далее. Цитата(alexdos @ Apr 28 2014, 14:28)  Тоже определял конец строки по таймауту. Работало. Потом перешел по \r\n. По \r\n оказалось более работоспособно, и нет никакой необходимости в знании сколько их будет в ответе. К примеру посмотрим на строку \r\nOK\r\nблаблабла\r\n, по первому \n мы видим что это начало строки (так как количество принятых байтов равно 2). По второму получаем ответ OK. По третьему получаем ответ блаблабла. Поэтому при разборе ответов, задача сводится к проверке "наборов байтов находящихся между \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 zebrox И почему конец сообщения определяется таймаутом?
... Apr 23 2014, 13:18 Иван Плетнев Цитата(zebrox @ Apr 23 2014, 21:18) И поч... Apr 23 2014, 15:21  Alechek Цитата(Иван Плетнев @ Apr 23 2014, 21:21)... Apr 25 2014, 08:29   tdocs.su Цитата(Alechek @ Apr 25 2014, 12:29) Само... Apr 25 2014, 08:42    Иван Плетнев Цитата(tdocs.su @ Apr 25 2014, 16:42) Одн... Apr 27 2014, 16:21     alexdos Цитата(Иван Плетнев @ Apr 27 2014, 19:21)... Apr 28 2014, 06:28      zebrox Цитата(alexdos @ Apr 28 2014, 08:28) ...Е... Apr 28 2014, 09:14       alexdos Цитата(zebrox @ Apr 28 2014, 12:14) Жду 1... Apr 28 2014, 10:28      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   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
|
|
|