Arduino GSM Module | Serial Monitor is looping and displaying excess characters


hi, first post on arduino forum, believe section of forum appropriate place seek guidance problem having.

i'm developing sim800l evb gsm module, interfacing through softwareserial.h library, hooked arduino uno.

i not have same problem of other posts gsm modules; code isn't not capable of running smoothly, lot of time code loop in strange way in serial monitor.

i post full code can view logic:
code: [select]
void setup()
{
  serial.begin(9600);


  while (!serial) {
    ; // wait serial port connect. needed native usb port only
  }
  gprs.begin(9600);
  //serial.println(gprs.available());
  //set appropriate case
  pinmode(redpin, output);
  pinmode(yelpin, output);
  pinmode(potpin, input);
  pinmode(buttonpin, input_pullup);
  digitalwrite(redpin, high);
  digitalwrite(yelpin, low);
  delay(3000);

  prelim();


  //gprs.println("at+cnmi=?");
  delay(420);
  delay(1000);




}

void loop()
{
  //read sim800 output (if available) , print in arduino ide serial monitor
  while (gprs.available()) {
    parseattext(gprs.read());
  }
  /* buttonstate = digitalread(buttonpin);
    if (buttonstate != lastbuttonstate) {
     if (buttonpin == high) {
       counter = counter + 1;
       buttonpushcounter = counter;
       serial.println(buttonpushcounter);
     }
     delay(500);
    }*/

  //potentiometer
  tempval = analogread(potpin);
  value = potentiometer(value);



} //end of loop function


void resetbuffer() {
  memset(buffer, 0, sizeof(buffer));
  pos = 0;
}

void parseattext(byte b) {

  buffer[pos++] = b;

  if ( pos >= sizeof(buffer) )
    resetbuffer(); // safe

  /*
    // detailed debugging
    serial.println();
    serial.print("state = ");
    serial.println(state);
    serial.print("b = ");
    serial.println(b);
    serial.print("pos = ");
    serial.println(pos);
    serial.print("buffer = ");
    serial.println(buffer);*/

  switch (state) {
    case ps_detect_msg_type:
      {
        if ( b == '\n' )
          resetbuffer();
        else {
          if ( pos == 3 && strcmp(buffer, "at+") == 0 ) {
            state = ps_ignoring_command_echo;
          }
          else if ( pos == 6 ) {
            //serial.print("checking message type: ");
            //serial.println(buffer);

            if ( strcmp(buffer, "+cmti:") == 0 ) {
              serial.println("received cmti");
              state = ps_read_cmti_storage_type;
            }
            else if ( strcmp(buffer, "+cmgr:") == 0 ) {
              serial.println("received cmgr");
              state = ps_read_cmgr_status;
            }
            resetbuffer();
          }
        }
      }
      break;


    case ps_ignoring_command_echo:
      {
        if ( b == '\n' ) {
          //serial.print("ignoring echo: ");
          //serial.println(buffer);
          state = ps_detect_msg_type;
          resetbuffer();
        }
      }
      break;

    case ps_read_cmti_storage_type:
      {
        if ( b == ',' ) {
          serial.print("sms storage ");
          serial.println(buffer);
          state = ps_read_cmti_id;
          resetbuffer();
        }
      }
      break;

    case ps_read_cmti_id:
      {
        if ( b == '\n' ) {
          lastreceivedsmsid = atoi(buffer);
          serial.print("sms id ");
          serial.println(lastreceivedsmsid);

          gprs.print("at+cmgr=");
          gprs.println(lastreceivedsmsid);
          //delay(500); don't this!

          state = ps_detect_msg_type;
          resetbuffer();
        }
      }
      break;

    case ps_read_cmgr_status:
      {
        if ( b == ',' ) {
          serial.print("cmgr status: ");
          serial.println(buffer);
          state = ps_read_cmgr_number;
          resetbuffer();
        }
      }
      break;

    case ps_read_cmgr_number:
      {
        if ( b == ',' ) {
          serial.print("cmgr number: ");
          serial.println(buffer);

          // uncomment these 2 lines check sender's cell number
          //validsender = false;
          //if ( strcmp(buffer, "\"+0123456789\",") == 0 )
          validsender = true;

          state = ps_read_cmgr_something;
          resetbuffer();
        }
      }
      break;



    case ps_read_cmgr_something:
      {
        if ( b == ',' ) {
          serial.print("cmgr something: ");
          serial.println(buffer);
          state = ps_read_cmgr_date;
          resetbuffer();
        }
      }
      break;

    case ps_read_cmgr_date:
      {
        if ( b == '\n' ) {
          serial.print("cmgr date: ");
          serial.println(buffer);
          state = ps_read_cmgr_content;
          resetbuffer();
        }
      }
      break;

    case ps_read_cmgr_content:
      {
        if ( b == '\n' ) {
          serial.print("cmgr content: ");
          serial.print(buffer);

          parsesmscontent();

          gprs.print("at+cmgd=");
          gprs.println(lastreceivedsmsid);

          sendsms(); // added sendsms() here other code.

          state = ps_detect_msg_type;
          resetbuffer();
        }
      }
      break;
  }
}
void prelim() {
  boolean iscomplete = false;
  while (iscomplete != true) {
    delay(1000);
    gprs.println("at+cscs=\"gsm\"\r");
    delay(125);
    gprs.println("at+cmgf=1\r");
    delay(125);
    gprs.println("at+cnmi=1,1,0,0,0\n\r");
    delay(125);

    iscomplete = true;
  }
  delay(3000);
  if (iscomplete == true) {

    (int = 0; <= 10; i++) {
      gprs.print("at+cmgd=");
      gprs.println(i);
      delay(200);


      // not necessary prevents serial monitor dropping input
      while (gprs.available())
        serial.write(gprs.read());
    }

  }
  serial.println("preliminary function has completed\nmodule ready");
}


i run prelim() function set module gsm mode, , set cnmi mode notify me when sms received.

i couldn't put entirety of code because of 9000 character limit. have been able program run without issues few times, serial monitor starts looping on , on , doesn't complete commands it's supposed execute.

i'll attach serial monitor output log explain mean. cpin ready, though never set program run at+cpin?.

is there fault in logic somehow putting prelim() function loop()?


as "displaying excess characters" part of subject line, serial monitor put "ÿ" @ end of of @ commands, , making processor think didn't send "at+cmgf=1", thinks sent "at+cmgf=1ÿ", there no ok , don't believe setting changed 1. doesn't every time run code, , ÿ not in same place.

is possible there not enough power being supplied arduino uno?

that not full code. variables redpin, yelpin, potpin, , buttonpin defined?


Arduino Forum > Using Arduino > Interfacing w/ Software on the Computer > Arduino GSM Module | Serial Monitor is looping and displaying excess characters


arduino

Comments

Popular posts from this blog

Error compiling for board Arduino/Genuino Uno.

Installation database is corrupt

esp8266 (nodemcu 0.9) client.write très lent ???