I have arduino leonardo and sim800h module. I don't seem to find the problem in my program, this is probably the 5th time I'm rewriting it. Please someone tell me what should I change to work normally. I decodes the answers, but some chars seem to disappear and sometimes appear again. With time only +CCLK stays everything else is gone. Also the time should update all the time, but the seconds stay the same for 5-10 seconds.
This is the code:
const long interval = 200;
static long currentMillis;
byte searchcharpos = 0; //To determine where is the + in +CCLK in the char array
char serialdata[256]; //Array to store the chars before parsing
char rtcy1[3]; //Current year Format: yy\0
char rtcm1[3]; //Current month Format: mm\0
char rtcd1[3]; //Current day Format: dd\0
char rtch1[3]; //Current hour Format: hh\0
char rtcmm1[3]; //Current minute Format: mm\0
char rtcs1[3]; //Current second Format: ss\0
byte pointingfinger = 0;
char enabledtime = 0;
char readenabl = 0;
char foundchar[6];
void setup() {
Serial.begin(9600); //USB to Computer
Serial1.begin(9600); //UART to Modem
Serial1.print("ATE0\r"); //Disable echo
}
void loop() {
if (millis() - currentMillis >= interval) //This is done every second
{
Serial1.print("AT+CCLK?\r");
Serial.println("=========");
Serial.print(serialdata[searchcharpos]);
Serial.print(serialdata[searchcharpos + 1]);
Serial.print(serialdata[searchcharpos + 2]);
Serial.print(serialdata[searchcharpos + 3]);
Serial.print(serialdata[searchcharpos + 4]);
Serial.print(serialdata[searchcharpos + 5]);
Serial.print(serialdata[searchcharpos + 6]);
Serial.print(serialdata[searchcharpos + 7]);
Serial.print(serialdata[searchcharpos + 8]);
Serial.print(serialdata[searchcharpos + 9]);
Serial.print(serialdata[searchcharpos + 10]);
Serial.print(serialdata[searchcharpos + 11]);
Serial.print(serialdata[searchcharpos + 12]);
Serial.print(serialdata[searchcharpos + 13]);
Serial.print(serialdata[searchcharpos + 14]);
Serial.print(serialdata[searchcharpos + 15]);
Serial.print(serialdata[searchcharpos + 16]);
Serial.print(serialdata[searchcharpos + 17]);
Serial.print(serialdata[searchcharpos + 18]);
Serial.print(serialdata[searchcharpos + 19]);
Serial.print(serialdata[searchcharpos + 20]);
Serial.print(serialdata[searchcharpos + 21]);
Serial.print(serialdata[searchcharpos + 22]);
Serial.print(serialdata[searchcharpos + 23]);
Serial.print(serialdata[searchcharpos + 24]);
Serial.print(serialdata[searchcharpos + 25]);
Serial.print(serialdata[searchcharpos + 26]);
Serial.print(serialdata[searchcharpos + 27]);
Serial.print(serialdata[searchcharpos + 28]);
Serial.print(serialdata[searchcharpos + 29]);
Serial.print(serialdata[searchcharpos + 30]);
Serial.print ("=========");
//Serial1.print("AT+CCLK?\r"); //ask for the time
//delay(50);
Serial.println("");
Serial.println("=====");
Serial.println(millis());
Serial.println("YEAR: ");
Serial.print(rtcy1[0]);
Serial.println(rtcy1[1]);
Serial.println("MONTH: ");
Serial.print(rtcm1[0]);
Serial.println(rtcm1[1]);
Serial.println("DAY: ");
Serial.print(rtcd1[0]);
Serial.println(rtcd1[1]);
Serial.println("HOUR: ");
Serial.print(rtch1[0]);
Serial.println(rtch1[1]);
Serial.println("MINUTE: ");
Serial.print(rtcmm1[0]);
Serial.println(rtcmm1[1]);
Serial.println("SECOND: ");
Serial.print(rtcs1[0]);
Serial.println(rtcs1[1]);
enabledtime = 1;
currentMillis = millis();
}
if (enabledtime == 1) {
if (Serial1.available () > 0) {
if (foundchar[0] == '\n') {
/*for (byte a = 0; a < 255; a = a + 1 ) {
serialdata[a] = 0;
}*/
readenabl = 0;
//pointingfinger = 0;
enabledtime = 0;
rtcy1[0] = serialdata[searchcharpos + 8]; //getting first char with its offset
rtcy1[1] = serialdata[searchcharpos + 9];
rtcy1[2] = '\0';
rtcm1[0] = serialdata[searchcharpos + 11];
rtcm1[1] = serialdata[searchcharpos + 12];
rtcm1[2] = '\0';
rtcd1[0] = serialdata[searchcharpos + 14];
rtcd1[1] = serialdata[searchcharpos + 15];
rtcd1[2] = '\0';
rtch1[0] = serialdata[searchcharpos + 17];
rtch1[1] = serialdata[searchcharpos + 18];
rtch1[2] = '\0';
rtcmm1[0] = serialdata[searchcharpos + 20];
rtcmm1[1] = serialdata[searchcharpos + 21];
rtcmm1[2] = '\0';
rtcs1[0] = serialdata[searchcharpos + 23];
rtcs1[1] = serialdata[searchcharpos + 24];
rtcs1[2] = '\0';
}
if (foundchar[0] == '\r') {
readenabl = 0;
//pointingfinger = 0;
enabledtime = 0;
rtcy1[0] = serialdata[searchcharpos + 8]; //getting first char with its offset
rtcy1[1] = serialdata[searchcharpos + 9];
rtcy1[2] = '\0';
rtcm1[0] = serialdata[searchcharpos + 11];
rtcm1[1] = serialdata[searchcharpos + 12];
rtcm1[2] = '\0';
rtcd1[0] = serialdata[searchcharpos + 14];
rtcd1[1] = serialdata[searchcharpos + 15];
rtcd1[2] = '\0';
rtch1[0] = serialdata[searchcharpos + 17];
rtch1[1] = serialdata[searchcharpos + 18];
rtch1[2] = '\0';
rtcmm1[0] = serialdata[searchcharpos + 20];
rtcmm1[1] = serialdata[searchcharpos + 21];
rtcmm1[2] = '\0';
rtcs1[0] = serialdata[searchcharpos + 23];
rtcs1[1] = serialdata[searchcharpos + 24];
rtcs1[2] = '\0';
}
foundchar[0] = foundchar[1];
foundchar[1] = foundchar[2];
foundchar[2] = foundchar[3];
foundchar[3] = foundchar[4];
foundchar[4] = foundchar[5];
foundchar[5] = Serial1.read();
if (foundchar[0] == '+' && foundchar[1] == 'C' && foundchar[2] == 'C' && foundchar[3] == 'L' && foundchar[4] == 'K') {
readenabl = 1;
pointingfinger = 0;
}
if (readenabl == 1) {
serialdata[pointingfinger] = foundchar[0];
serialdata[pointingfinger + 1] = 0;
pointingfinger++;
}
}
}
}
This is the output:
Thanks!

Serialis the same as those ofSerial1. Printing a debug stuff or whatever is extremely slow onSerial. Increase to at least 115200 baud onSerialso you can eliminate the possibility of waiting too long for serial writes.\r\nI think?). In that loop, just dump the received data into a buffer. After it was received completely, analyze the received response (split into year, month, day, et cetera). I think you are loosing to much time in your combined "read and process" method with a billion variable assignments before each read.sscanfthe integers out of there.