Как отправить 0x1A в виде данных через TCP на SIM8xx?
Я использую модуль 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 как символ завершения?
@Shekhar Saha, 👍3
Обсуждение1 ответ
Для обычных команд 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
- Несколько клиентских серверов через Wi-Fi
- Есть ли хорошая рабочая библиотека MODBUS TCP master для Arduino?
- ESP8266 TCP-соединение WiFiClient проблема
- Как запустить TCP-сервер сокетов на Arduino Uno WiFi?
- ESP8266 отправляет TCP HEX-пакет из 4 символов
- Как создать TCP-сервер на Arduino UNO WiFi?
- Пример класса ESP8266 ASyncTCP
- TCP-клиент readStringUntil только при наличии данных
Используйте команду AT+CIPSEND=<длина>, чтобы указать количество отправляемых байтов., @liaifat85