Ви не увійшли.
Может просто данные не все успевают прейти по UART скорость то не большая, а ты уже пытаешься прочитать из буфера весь пакет. После каждой первичной проверки наличия в порту данных, поставь задержку, в зависимости от скорости порта и длины всего пакета.
Да, метод Serial.readStringUntil('\n') читает полностью строку до служебного символа новой строки, а только потом её отдаёт. Зато потеряться ничего не должно.
Изменил - стало хуже. Теперь такое чувство вроде буфер накапливает символы, а потом их с задержкой в пару секунд выводит.
if (Serial.available() > 0) {
String str = Serial.readStringUntil('\n');
if (str.startsWith("+CMT")) ...
А если как-то так вычитывать? Да и не помешало бы всё вычитанное отправлять в Serial Monitor для отладки. Бывает логика подсказывает одно, а глазами увидишь - и всё становится ясно.
____________________________
"серийный порт" - для маньяков
Скетч не мой. Я новичек arduino, но есть желание разобраться. Неправильно отрабатывает "Функция чтения из буфера серийного порта gsm модема одной строки", а может быть и "Функция чтения всего буфера с серийного порта gsm модема" . При получении команды от модема gsmSerial определение "+CMT" происходит не каждый раз. Проверял в proteus и через монитор порта arduino на живом железе. Пробовал для теста менять "+СMT" на "1" опредение "1" тоже происходит не каждый раз.
#include <SoftwareSerial.h>
// переменные
SoftwareSerial gsmSerial(9, 11); // RX, TX
String currentStr = "";
/*
* Функция чтения всего буфера с серийного порта gsm модема
*/
String readSerial() {
String inData = "";
if (gsmSerial.available() > 0) {
int h = gsmSerial.available();
for (int i = 0; i < h; i++) {
inData += (char)gsmSerial.read();
}
return inData;
}
else {
return "No connection";
}
}
/*
* Функция чтения из буфера серийного порта gsm модема одной строки
*/
String readSerialStr() {
String content = "";
boolean retStr=false;
char currentChar;
delay(100);
while(gsmSerial.available() && retStr==false) {
currentChar = gsmSerial.read();
//if (currentChar=='\n' || currentChar=='\r') {
if (currentChar=='\n') {
retStr=true;
}
else {
content.concat(currentChar);
}
}
return content;
}
void setup(){
// Начинаем последовательный обмен данными и ждем открытие порта
Serial.begin(9600);
Serial.flush();
gsmSerial.begin(9600);
gsmSerial.flush();
// опрашиваем gsm-модем
delay(500);
gsmSerial.println("AT+CMGF=1"); // выставляем текстовым режим сообщений
delay(500);
gsmSerial.println("AT+IFC=1,1"); // Set Local Data Flow Control
delay(500);
gsmSerial.println("AT+CPBS=\"SM\""); // SIM Phonebook Memory Storage
delay(500);
gsmSerial.println("AT+CNMI=1,2,2,1,1"); // Включаю перехват SMS
delay(500);
Serial.println("System Ready ..."); // Инициализация после Сброса
}
void loop(){
//if (gsmSerial.available()){ // если в буфере серийного порта есть данные (для теста)
// Serial.print((char)gsmSerial.read()); // отправить на модем (для теста)
//}
//if (Serial.available()){ // если в буфере серийного порта есть данные (для теста)
// gsmSerial.print((char)Serial.read()); // отправить на модем (для теста)
//}
if (gsmSerial.available()){ // если в буфере серийного порта есть данные
currentStr=readSerialStr(); // считываем одну строку из буфера серийного порта посимвольно
currentStr.trim();
//Serial.print(currentStr);
if (currentStr.startsWith("+CMT")) { // и если текущая строка начинается с "+CMT", то следующая строка является сообщением
currentStr=readSerialStr(); // считываем еще одну строку из буфера серийного порта посимвольно
currentStr.trim();
Serial.println("currentStr");
if (currentStr.compareTo("STATUS")==0) { // если sms сообщене это "STATUS"
Serial.println("Command received. Execute 'STATUS'");
}
}
}
}