Доброго всем времени суток, хочу написать функцию которая будет читать все ответы от модуля SIM800 и возвращать то что прочитано но немного застрял. Первая идея была считать все в переменную типа String. все получилось но полазив по форуму почитал и решил его не использовать вот написал такую функцию Код (C++): char readSIM (){ char buffer[100]; int i = 0; if (Serial.available()) { delay(100); //загоняем прочитанное в буфер while ( Serial.available() && i < 99) { buffer[i++] = Serial.read(); } //закрываем массив buffer[i++] = '\0'; return buffer; } }// end readSIM IDE выдает ошибку (In function 'char readSIM()': ... error: invalid conversion from 'char*' to 'char' [-fpermissive]) конечно можно вывести переменную как глобальную но снова не очень хороший тон программирования а хочется красиво , для себя ведь. как можно передать string (char) из функции
Код (C++): char* readSIM (){ Только так делать нельзя. Вы вернете ссылку на строку, которая существует только внутри функции. Поэтому да, нужно объявлять строку глобально, при вызове функции передавать адрес массива как параметр.
У меня несколько вопросов: Что за спецсимволы /r и /n ? Как отделить само сообщение от служебной инфы в смс. Всегда ли первая строка одинаковой длины? Пробую делать так: Код (C++): void loop() { while (Serial2.available()) { delay(20); currSymb = Serial2.read(); if ('\r' == currSymb) Serial.println("**"); if ('\n' == currSymb) Serial.println("%%"); currStr = currStr + String(currSymb); } if (currStr != "") { Serial.println(currStr); currStr = ""; } } Отображается так: ** %% ** %% ** %% +CMT: "+79151536972","","16/10/20,16:11:26+12" gjmptw€ И еще самый последний символ. Он то есть то нет. Что он такое?
У себя на SIM800L тоже заметил в последнее время - если в СМС содержится маленькая w - идет следом знак евро, если не ошибаюсь. Раньше у меня такого не было, оператор Мегафон-Кавказ.
Первый - перевод каретки (курсора) в начало строки; второй - переход на новую строку (вниз). Все вместе - переводит курсор в начало новой строки.
Получается для облегчения себе жизни нужно исключить в смс символа w. А как отловить конец первой строки смс?
В итоге смс принимаю так: Код (C++): char currSymb; String currStr, message; int i; void setup() { Serial.begin(19200); Serial2.begin(19200); currStr = ""; message = ""; } void loop() { while (Serial2.available()) { delay(20); currSymb = Serial2.read(); currStr = currStr + String(currSymb); } if (currStr != "") { i = currStr.length(); for (i = 50; i < (currStr.length()-2); i++) message += currStr.charAt(i); currStr = ""; Serial.print(message); } } текст смски находится в переменной message. Правда это все верно при условии постоянной длины первой строки смс. Но как я заметил, если например время 4 минуты то в смске отображается 04 минуты, и с секундами, часами также. Так что должно работать нормально. Пока что обкатываю.
Для чего Вам первая (из приведенных) строка? Поясню. В первой строке, значение переменной "i" будет равно длине строки "currStr", а во второй, этой же переменной Вы присваиваете значение 50.