Как отправить 0x1A в виде данных через TCP на SIM8xx?

tcpip sim800

Я использую модуль SIM868 с Arduino Mega, где SIM868 подключен к Serial1.

После установления TCP-соединения мне нужно отправить следующий поток байтов:

{0x60, 0x1A, 0x9D, 0x01, 0x00, 0x00, 0x07}

Я пытаюсь отправить эти данные, используя:

byte message[] = {0x60, 0x1A, 0x9D, 0x01, 0x00, 0x00, 0x07};
Serial1.write(message, sizeof(message));

Однако передаётся только первый байт (0x60). Передача останавливается на 0x1A, поскольку 0x1A (Ctrl-Z) интерпретируется SIM868 как сигнал конца данных.

Как отправить весь массив байтов, чтобы SIM868 не обрабатывал 0x1A как символ завершения?

, 👍3

Обсуждение

Используйте команду AT+CIPSEND=<длина>, чтобы указать количество отправляемых байтов., @liaifat85


1 ответ


5

Для обычных команд TCP AT модули SIM (применимо не только к SIM868, но и к другим модулям SIM) используют сочетание клавиш CTRL-Z (т.е. 0x1A) для завершения сообщения. Модуль SIM переключается из командного режима в режим данных при отправке команды AT+CIPSEND, а приглашение > означает готовность к приему данных, а сочетание клавиш CTRL-Z завершает режим данных. Типичная операция TCP выглядит следующим образом.

AT+CGATT?             // Состояние службы GPRS
+CGATT: 1
OK

AT+CSTT=”CMNET”       // Запустить задачу и установить APN.
OK                    // APN по умолчанию — «CMNET»,
                      // без имени пользователя и пароля.

AT+CIICR              // Установить беспроводное соединение
OK

AT+CIFSR              // Получить локальный IP-адрес
10.78.245.128

AT+CIPSTART=”TCP”,”116.228.221.51”,“8500"  // Запуск TCP-соединения
OK
CONNECT OK            // TCP-соединение установлено

AT+CIPSEND            // Отправка данных на удаленный сервер, CTRL+Z (0x1a) для отправки.
> hello TCP serve     // Пользователь должен записывать данные только после получения промо-кода “>”

SEND OK               // данные были отправлены и получены
                      // успешно удаленным сервером
Hello SIM800          // Получены данные с удаленного сервера
CLOSED                // Сервер закрыл соединение

Чтобы отправить 0x1A как часть полезной нагрузки данных, можно настроить модуль на работу в «Прозрачном режиме», который позволяет отправлять специальные символы ASCII, такие как 0x1A, как часть данных. «Прозрачный режим» можно включить, отправив команду AT+CIPMODE=1. Приглашение для входа в режим данных отличается от обычного режима TCP: приглашение > заменяется на CONNECT, обозначая начало данных, а для завершения передачи данных необходимо отправить +++ для выхода из режима данных.

AT+CGATT?             // Статус службы GPRS
+CGATT: 1
OK

AT+CIPMODE=1          // Включить прозрачный режим
OK

AT+CSTT=”CMNET”       // Запустить задачу и установить APN.
OK

AT+CIICR              // Установить беспроводное соединение
OK

AT+CIFSR              // Получить локальный IP-адрес
10.78.245.128

AT+CIPSTART=”TCP”,”116.228.221.51”,“8500"  // Запускаем TCP-соединение
OK
CONNECT               // TCP-соединение установлено

....                  // Входные данные в последовательный порт, нет эха, поэтому не вижу входные данные
                      // Выйдите из режима данных, введя «+++» или потянув DTR (если доступно аппаратное управление потоком данных)
OK

ATO                   // Возврат в режим данных
CONNECT
Hello SIM800          // Получены данные с удаленного сервера
CLOSED                // Сервер закрыл соединение
,

Полагаю, для этого требуется период простоя вокруг +++, как это было в аналоговых модемах?, @grawity_u1686

Интересный факт: только модемы Hayes требовали период бездействия, потому что у Hayes был на него патент. (Хотя, судя по всему, они лицензировали его. Но годы спустя я столкнулся с модемом без защитного периода и потроллил своего друга с помощью escape-последовательности.) https://en.wikipedia.org/wiki/Time_Independent_Escape_Sequence, @Glenn Willen

@grawity_u1686 прав, согласно руководству по AT-командам SIM8xx, требуется пауза в 1 секунду до и после escape-последовательности +++, чтобы предотвратить обработку +++ как части данных., @hcheung