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

 
 
> 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 27 2014, 22:46
Сообщение #2


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

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



После снятия ртса сим выдаст следующую строку, проц выставит ртс, обработает ее, уберет ртс и так до тех пор, пока сим все строки не выдаст.

Большинство сообщений от сима имею заголовок, +IPR например. В програме заданы все заголовки на которые надо реагировать.
Если в пришедшей строке найден один из заголовков, то проц уходит в его обработчик, который знает в какой что читать.
ОК и ЕРРОР так-же определены как заголовки. При их приходе проверяется проверяется последняя переданная команда (храню условный номер).
Если на эту команду ответ должен быть ОК, а пришел ЕРРОР, то снова передаю ту команду.
Если пришел ОК то переход к слудующей команде. Это уже обычная машина сосостояний.
Go to the top of the page
 
+Quote Post
tdocs.su
сообщение Apr 28 2014, 06:11
Сообщение #3


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

Группа: Участник
Сообщений: 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 устанавливается следующее состояние.
Короче, все просто оказалось, но намучился с этим всем конкретно, когда шел не автоматным путем.


--------------------
Go to the top of the page
 
+Quote Post
Иван Плетнев
сообщение Apr 28 2014, 15:38
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 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". Единственное что портит всю картину это приглашение к вводу данных "> ", но и это обходится очень просто.


Это Вы в прерывании всё делаете? Если так, то приличный такой обработчик в прерывании будет крутиться. А если нет, тогда опять не ясно, как конец сообщения определить?
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
- - 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


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

 


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


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