Собственно, есть вот такой вот примерчик отсюда
http://wiki.amperka.....8C:gprs-shield
Меня интересует прием смс
- Код: Выделить всё
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(7, 8);
//для зелёного светодиода будем использовать второй цифровой вход,
//а для жёлтого - третий
int greenPin = 2;
int yellowPin = 3;
void setup()
{
gprsSerial.begin(19200);
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
// Настраиваем приём сообщений с других устройств
// Между командами даём время на их обработку
gprsSerial.print("AT+CMGF=1\r");
delay(300);
gprsSerial.print("AT+IFC=1, 1\r");
delay(300);
gprsSerial.print("AT+CPBS="SM"\r");
delay(300);
gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
delay(500);
}
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
void loop()
{
if (!gprsSerial.available())
return;
char currSymb = gprsSerial.read();
if ('\r' == currSymb) {
if (isStringMessage) {
//если текущая строка - SMS-сообщение,
//отреагируем на него соответствующим образом
if (!currStr.compareTo("Green on")) {
digitalWrite(greenPin, HIGH);
} else if (!currStr.compareTo("Green off")) {
digitalWrite(greenPin, LOW);
} else if (!currStr.compareTo("Yellow on")) {
digitalWrite(yellowPin, HIGH);
} else if (!currStr.compareTo("Yellow off")) {
digitalWrite(yellowPin, LOW);
}
isStringMessage = false;
} else {
if (currStr.startsWith("+CMT")) {
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
}
Тут все очевидно...
Читаем сериал GSM, собираем строку и отлавливаем по окончании строки флажок - СМС сообщение (+CMT)
Далее читаем продолжение этого самого смс сообщения...Но вот в чем проблема - Когда приходит первая часть смс в виде
+CMT: "+79999999999","NAME","16/01/28,00:36:38+24"
эта самая часть видимо умещается в 64 символа и все бы ничего, если бы вторая часть сообщения умещалась в эти же самые 64 символа. Не знаю почему, но модуль не умеет скорее всего принимать все 160 символов разрешенные на одну смс и пересылает 160 символов частями по 64...
Поэтому запустив данный пример и отослав просто сообщение длинной в 140 символов ничего кроме вышеупомянутой строки в монитере порта я не увидел. Отослав же сообщение длинной в 60 символов мы видим все красиво
+CMT: "+79999999999","NAME","16/01/28,00:36:38+24"
qwerty qwerty qwerty qwerty
Вопрос - каким образом можно собрать строку из этих частей оставшихся, если сообщение больше 64 символов?
Пробовал таким способом, непосредственно с вики
- Код: Выделить всё
if (gprsSerial.available()) // if date is comming from softwareserial port ==> data is comming from gprs shield
{
while (gprsSerial.available()) // reading data into char array
{
bufGsm[countBufGsm++] = gprsSerial.read(); // writing data into array
if (countBufGsm == 64)
{
break;
}
}
Serial.write(buffer, count);
clearBufferArray(); // call clearBufferArray function to clear the storaged data from the array
countBufGsm = 0; // set counter of while loop to zero
}
И вроде даже в Serial.write(buffer, count); выводится полное сообщение но опять же каким образом тут можно собрать строку?
Пытался сделать следующее
- Код: Выделить всё
char bufGsm[64]; // buffer array for data recieve over serial port
String inputGsmStr = ""; //входящая строка с gsm модема
int countBufGsm = 0;
void Manage()
{
if (gprsSerial.available()) // if date is comming from softwareserial port ==> data is comming from gprs shield
{
while (gprsSerial.available()) // reading data into char array
{
bufGsm[countBufGsm++] = gprsSerial.read(); // writing data into array
if (countBufGsm == 64)
{
break;
}
}
inputGsmStr += bufGsm;
clearBufferArray(); // call clearBufferArray function to clear the storaged data from the array
countBufGsm = 0; // set counter of while loop to zero
}
}
void clearBufferArray() // function to clear buffer array
{
for (int i = 0; i < countBufGsm; i++)
{
bufGsm[i] = NULL;
}
}
Но выходит что каждый раз когда мы отрезаем часть по 64 и дописываем в строку, то в inputGsmStr записываются те самые части по 64, потом 128 и т.д..она растет постоянно до тех пор пока не получим полную строку. В таком случае функция проверки, что это СМС сообщение запустится столько раз, сколько у нас частей по 64...
Какие идеи?