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: yy0円
char rtcm1[3]; //Current month Format: mm0円
char rtcd1[3]; //Current day Format: dd0円
char rtch1[3]; //Current hour Format: hh0円
char rtcmm1[3]; //Current minute Format: mm0円
char rtcs1[3]; //Current second Format: ss0円
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!
1 Answer 1
This is the final working program that requests the time and parses the answer:
const long interval = 1000;
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: yy0円
char rtcm1[3]; //Current month Format: mm0円
char rtcd1[3]; //Current day Format: dd0円
char rtch1[3]; //Current hour Format: hh0円
char rtcmm1[3]; //Current minute Format: mm0円
char rtcs1[3]; //Current second Format: ss0円
byte pointingfinger = 0; //index of the array
char enabledtime = 0; //this variable is set to 1 every second and set to 0 after parsing is done
char readenabl = 0; //this is set to 1 when is finished reading from serial
char foundchar[6]; //small buffer that works as a shift register to hold only the command for comparison
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') {
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円';
}
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' && foundchar[5] == ':') {
readenabl = 1;
pointingfinger = 0;
}
if (readenabl == 1) {
while (foundchar[0] != '\n') {
if (Serial1.available() > 0) {
serialdata[pointingfinger] = foundchar[0];
serialdata[pointingfinger + 1] = 0;
pointingfinger++;
foundchar[0] = foundchar[1];
foundchar[1] = foundchar[2];
foundchar[2] = foundchar[3];
foundchar[3] = foundchar[4];
foundchar[4] = foundchar[5];
foundchar[5] = Serial1.read();
}
}
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円';
}
}
}
}
Serial
is the same as those ofSerial1
. Printing a debug stuff or whatever is extremely slow onSerial
. Increase to at least 115200 baud onSerial
so you can eliminate the possibility of waiting too long for serial writes.\r\n
I 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.sscanf
the integers out of there.