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);
}

, 👍0

Обсуждение

Как / где вы видите вывод и ответ?, @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


1 ответ


Лучший ответ:

0

Вы переполняете буфер последовательного приема. Существует только ограниченный объем пространства (обычно 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