Serial.print() не печатает полностью
Функция println() используется для отправки AT-команд на модуль GSM.
sim800l.println("AT+CLTS=1");
delay(3000);
sim800l.println("AT+COPS=2");
delay(3000);
sim800l.println("AT+COPS=0,0");
delay(3000);
Но проблема в выводе -
AT+CLTS=1
OK
AT+COP
Команда AT+COP не напечатала полностью? Почему?
Минимально воспроизводимый пример —
#include <SoftwareSerial.h> //Библиотека, необходимая для последовательной связи
char MYDATA[18];
SoftwareSerial sim800l(3, 2); // RX,TX для Arduino и для модуля это TXD RXD, их нужно инвертировать
void setup() {
Serial.begin(9600); //Запускаем последовательный интерфейс на 9600
sim800l.begin(9600);
delay(100);
// AT-команда для перевода sim800l в режим SMS
sim800l.println("AT+CMGF=1");
//Последовательный();
delay(100);
// Установите модуль для отправки данных SMS на серийный номер после получения
sim800l.println("AT+CNMI=2,2,0,0,0");
delay(100);
sim800l.println("AT+CLTS=1");
delay(3000);
sim800l.println("AT+COPS=2");
delay(3000);
sim800l.println("AT+COPS=0,0");
delay(3000);
sim800l.println("AT+CCLK?");
Serial.find("+CCLK: \"");
Serial.readBytesUntil('\+', MYDATA, 17);
}
void loop() {
Serial.print(MYDATA);
}
@Bhavya Gupta, 👍0
Обсуждение1 ответ
Лучший ответ:
Вы переполняете буфер последовательного приема. Существует только ограниченный объем пространства (обычно 64 байта, может быть меньше в SoftwareSerial) для получения данных, прежде чем вы должны будете их прочитать или потерять данные. Поскольку вы просто вслепую бросаете команды на SIM800 и ничего не делаете с его ответами, пока в самом конце все входящие данные не заполнят приемный буфер до переполнения.
Ваша методология ошибочна (это не ваша вина, все примеры в Интернете — ерунда и учат вас делать что-то неправильно). То, что вы должны сделать, это выдать команду, затем получить ответ и проанализировать его, чтобы увидеть, была ли команда успешной или нет, и получить любую информацию, которую может включать ответ, которую вы хотели бы знать.
Мне не нужна информация от команд. Я просто хочу слепо отдать команду. Как я могу очистить буфер?, @Bhavya Gupta
Прочтите это. Или, если вам все равно, что он возвращает, почему вы вообще хотите что-то отображать?, @Majenko
Поскольку последняя команда, я хочу прочитать результат AT+CCLK. Мой модуль не получает последнее время. Таким образом, все команды необходимы, чтобы AT+CCLK возвращал правильную дату., @Bhavya Gupta
Итак, вы *делаете* хотите читать и интерпретировать ответы. По крайней мере, вы должны читать после *каждой* команды и искать OK или ERR и отбрасывать все остальное., @Majenko
Я очень смущен. Если я открою свой собственный минимальный воспроизводимый пример, последовательного вывода не будет. Тогда почему я получаю вывод в своем исходном коде?, @Bhavya Gupta
Без понятия. Напишите себе простую процедуру построчного чтения/сравнения, которую вы можете запускать после каждой команды (кроме той, которая вас интересует), которая возвращает результат TRUE/FALSE в зависимости от того, находит ли она OK или ERR. Делайте все правильно с самого начала, и позже все станет проще., @Majenko
Нет ли какой-нибудь команды для очистки последовательного буфера?, @Bhavya Gupta
Да. читать. пока (sim800l.доступно()) { sim800l.read(); }
, @Majenko
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Как / где вы видите вывод и ответ?, @DataFiddler
@DataFiddler Последовательный монитор Arduino, @Bhavya Gupta
Не могли бы вы привести минимальный, полный, воспроизводимый пример? https://stackoverflow.com/help/минимально-воспроизводимый-пример, @Filip Franik
... пожалуйста, расширьте свой фрагмент кода, чтобы показать этот вывод Serial Monitor (по крайней мере). Минимальный, но полный тестовый скетч, конечно, был еще лучше., @DataFiddler
Ничто в этом коде не должно выводиться на последовательный монитор. Показать *весь* ваш код., @Majenko
@Majenko Хорошо, хорошо, подождите минутку. до тех пор sim800l является библиотекой Software Serial., @Bhavya Gupta
@Majenko Пожалуйста, смотрите., @Bhavya Gupta
@FilipFranik Пожалуйста, смотрите., @Bhavya Gupta
@DataFiddler Пожалуйста, смотрите., @Bhavya Gupta
Спасибо за измененный код: Вы отправляете некоторые команды на свой sim800l. Затем вы пытаетесь читать из Serial. Если что-то должно появиться, вы возвращаете несколько из этих символов постоянно. Ваш
Serial.find
, вероятно, истечет по тайм-ауту. ВашSerial.readBytesUntil
, вероятно, тоже истечет по тайм-ауту и даст вам не более 17 символов., @DataFiddlerКстати:
предупреждение: неизвестная escape-последовательность: '\+'
в вашемreadBytesUntil
, @DataFiddler