sendATCommand не объявлен в этой области

Это программа Arduino для GSM и GPS модема. В этом модеме GPS отправляет местоположение пользователю с помощью модема GSM, но постоянно получает эту ошибку.

здесь программа, которую я получаю это снова и снова, даже после того, как некоторые изменения в программе ATCommand предназначены для ответа модуля SIM908 int8_t;

int onModulePin= 2; 
char aux_string[30]; 
int flag = 0;

char number [20]; 
char realnumber[9]; 
char mynumber[9]; 

int a=0;
int b=0; 
int c=0;

//Your phone number

char phone_number[]="85274****5";


char data[100]; 
int data_size;
char aux_str[30]; 
char aux;

int x = 0; 
char N_S,W_E;



char frame[200];
char latitude[15];  
char longitude[15]; 
char altitude[6]; 
char date[16];

char time[7]; 

char satellites[3]; 
char speedOTG[10]; 
 char course[10];


void setup(){ 
  mynumber[0]='8'; 
  mynumber[1]='5'; 
  mynumber[2]='2'; 
  mynumber[3]='7'; 
  mynumber[4]='4'; 
  mynumber[5]='*'; 
  mynumber[6]='*'; 
  mynumber[7]='*'; 
  mynumber[8]='*'; 
  mynumber[9]='5';


  pinMode(onModulePin, OUTPUT); Serial.begin(115200);



  delay(5000);


   sendATcommand("AT+CPIN=****", "OK", 2000);


   delay(3000);


   while( (sendATcommand("AT+CREG?", "+CREG: 0,1", 1000) ||         sendATcommand("AT+CREG?", "+CREG: 0,5", 1000)) == 0 );


   sendATcommand("AT+CLIP=1", "OK", 1000);


   while ( start_GPS() == 0);


   while (sendATcommand("AT+CREG?", "+CREG: 0,1", 2000) == 0);


   // sets APN , user name and password          
   sendATcommand("AT+SAPBR=3,1,\"Contype\",\"GPRS\"","OK", 2000); 
   sendATcommand("AT+SAPBR=3,1,\"APN\",\"*******\"", "OK",2000); 
   sendATcommand("AT+SAPBR=3,1,\"USER\",\"*******\"","OK", 2000); 
   sendATcommand("AT+SAPBR=3,1,\"PWD\",\"*******\"", "OK",2000);


   // gets the GPRS bearer

   while (sendATcommand("AT+SAPBR=1,1", "OK", 20000) == 0)

  {

  delay(5000);

   }


  delay(1000);

   while(Serial.available() != 0)

  {

   Serial.read();

   }

  }

  void loop(){


  answer = sendATcommand("", "+CLIP", 1000);  //Detect incomming call

   if (answer == 1)

 {

  Serial.println("Incoming call");


  if ( flag == 0){


  for (int i=0; i<19; i++){ // read the incoming byte:


  while (Serial.available() == 0)

{

 delay (50);

 }

 //Stores phone number number[i] = Serial.read();


 }

Serial.flush(); flag = 1;

 }

   //Stores phone calling number  for (int i=0; i<=14; i++){

 if(number[i]== '"'){       i++;
 realnumber[0]=number[i]; i++; 
 realnumber[1]=number[i]; i++; 
 realnumber[2]=number[i]; i++; 
 realnumber[3]=number[i]; i++; 
 realnumber[4]=number[i]; i++; 
 realnumber[5]=number[i]; i++; 
 realnumber[6]=number[i]; i++; 
 realnumber[7]=number[i]; i++; 
 realnumber[8]=number[i];

 break;

 }

}


  //Check phone number  for (int i=0;i<9;i++){

if (realnumber[i] == mynumber[i]){ a++;

if( a==9){

 Serial.println("Correct number"); sendATcommand("ATH", "OK", 1000);

if(b==1){ b=0;
}else{ b=1; c=1; 
 }  

 break;

}

}else{

 Serial.println("Wrong number");  break;

}

}

a=0; answer=0; flag = 0;

}

 //Send SMS once and position to HTTP if (b==1){

 get_GPS(); send_HTTP(); delay(500);

 if (c==1){ sendSMS(); delay(100);

c=0;

 }

 }


 }


void power_on(){


 uint8_t answer=0;


 digitalWrite(onModulePin,HIGH); delay(3000); 
  digitalWrite(onModulePin,LOW);

 while (answer ==  0 ){  // Send AT every two seconds
 and wait for the  answer  

 answer = sendATcommand("AT", "OK", 2000);

   }

 }


 int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int    timeout){


uint8_t x=0, answer=0;  char response[100];  unsigned long previous;

    memset(response,  '\0'  , 100 );        // Initialice the string                                 
    delay(100);                        
   while ( Serial.available() > 0 ) Serial.read(); //Clean the input buffer        
   if (ATcommand[ 0  ] != '\0'   )         

   {                                         

    Serial.println(ATcommand);        
     }

   x = 0;
   previous = millis();


   // this loop waits for the answer  do{

  if(Serial.available() != 0){ // if there are data in the UART input   buffer, reads it and checks for the asnwer

 response[x] = Serial.read();  //Serial.print(response[x]);

 x++;

 if (strstr(response, expected_answer) != NULL) // check if the desired answer (OK) is in the response of the module

{

answer = 1;

}

}

}while((answer == 0) && ((millis() - previous) <timeout));  // Waits for the asnwer with time out


  return answer;

  }


  void power_onGPS(){

  uint8_t answer=0;    // checks if the module is started

  answer = sendATcommand("AT", "OK", 2000);  if (answer == 0)

  {

 // power on pulse
 digitalWrite(onModulePin,HIGH); delay(3000); digitalWrite(onModulePin,LOW);

  // waits for an answer from the module while(answer == 0){

  // Send AT every two seconds and wait for the answer

  answer = sendATcommand("AT", "OK", 2000);

 }

 }


 }


 int8_t start_GPS(){


 unsigned long previous;


 previous = millis();  // starts the GPS

  sendATcommand("AT+CGPSPWR=1", "OK", 2000); sendATcommand("AT+CGPSRST=0", "OK", 2000);

 // waits for fix GPS

 while(( (sendATcommand("AT+CGPSSTATUS?", "2D Fix", 5000) ||

 sendATcommand("AT+CGPSSTATUS?", "3D Fix", 5000)) ==0 ) &&

((millis() - previous) < 90000)); 


if ((millis() - previous) < 90000)

{

 return 1;

}

else

{

return 0;

 }  

}


int8_t get_GPS(){


int8_t counter, answer;  long previous;


// First get the NMEA string  // Clean the input buffer

 while( Serial.available() > 0) Serial.read();  // request Basic string

sendATcommand("AT+CGPSINF=0", "AT+CGPSINF=0\r\n\r\n", 2000);


 counter = 0; answer = 0;

 memset(frame, '\0', 100); // Initialize the string previous = millis();

 // this loop waits for the NMEA string  do{


 if(Serial.available() != 0){ frame[counter] = Serial.read(); counter++;

 // check if the desired answer is in the response of the module

 if (strstr(frame, "OK") != NULL)

{

answer = 1;

}

}

// Waits for the asnwer with time out


}

 while((answer == 0) && ((millis() - previous) < 2000));


frame[counter-3] = '\0';


// Parses the string strtok(frame, ",");

strcpy(longitude,strtok(NULL, ",")); // Gets longitude     
strcpy(latitude,strtok(NULL, ",")); // Gets latitude    
strcpy(altitude,strtok(NULL, ".")); // Gets altitude 
strtok(NULL, ",");

strcpy(date,strtok(NULL, ".")); // Gets date strtok(NULL, ",");

strtok(NULL, ","); strcpy(satellites,strtok(NULL, ",")); // Gets satellites

strcpy(speedOTG,strtok(NULL, ",")); // Gets speed over ground. Unit is knots.

strcpy(course,strtok(NULL, "\r")); // Gets course


 convert2Degrees(latitude);

  convert2Degrees(longitude);


 return answer;

 }


  /* convert2Degrees ( input ) - performs the conversion from input

 * parameters in DD°MM.mmm’ notation to DD.dddddd° notation.


 * Sign '+' is set for positive latitudes/longitudes (North, East)

* Sign '-' is set for negative latitudes/longitudes (South, West)


*/

int8_t convert2Degrees(char* input){


float deg;

float minutes; boolean neg = false;  //auxiliar variable  char aux[10];

if (input[0] == '-')

{

 neg = true;

 strcpy(aux, strtok(input+1, "."));


 }

 else

 {

  strcpy(aux, strtok(input, "."));

  }  // convert string to integer and add it to final float variable

  deg = atof(aux);


  strcpy(aux, strtok(NULL, '\0')); minutes=atof(aux); minutes/=1000000;
  if (deg < 100)

  {

   minutes += deg; deg = 0;

  }

   else


 {

  minutes += int(deg) % 100; deg = int(deg) / 100;

 } // add minutes to degrees deg=deg+minutes/60;

 if (neg == true)

{

 deg*=-1.0;

}


neg = false;


if( deg < 0 ){ neg = true; deg*=-1;

}


 float numberFloat=deg;  int intPart[10];

 int digit;

 long newNumber=(long)numberFloat;  int size=0;


 while(1){ size=size+1; digit=newNumber%10;
 newNumber=newNumber/10; intPart[size-1]=digit;

 if (newNumber==0){  break;

}

}


int index=0;

if( neg ){ index++; input[0]='-';

}

for (int i=size-1; i >= 0; i--)

{

input[index]=intPart[i]+'0'; index++;

}


input[index]='.'; index++;


numberFloat=(numberFloat-(int)numberFloat);  for (int i=1; i<=6 ; i++)

{

numberFloat=numberFloat*10; digit= (long)numberFloat;  numberFloat=numberFloat-digit; input[index]=char(digit)+48; index++;
}

 input[index]='\0';


 }


 void send_HTTP(){


 uint8_t answer=0; // Initializes HTTP service

answer = sendATcommand("AT+HTTPINIT", "OK", 10000);  if (answer == 1)

{ // Sets CID parameter

answer = sendATcommand("AT+HTTPPARA=\"CID\",1", "OK", 5000);
if (answer == 1)

{

 // Sets url sprintf(aux_str,

 "AT+HTTPPARA=\"URL\",\"http://%s/demo_sim908.php?", url);     Serial.print(aux_str);

 sprintf(frame,

"visor=false&latitude=%s&longitude=%s&altitude=%s&time=%s&s atellites=%s&speedOTG=%s&course=%s",

latitude, longitude, altitude, date, satellites, speedOTG, course);

 Serial.print(frame);

 answer = sendATcommand("\"", "OK", 5000);  if (answer == 1)

 {

  // Starts GET action

  answer = sendATcommand("AT+HTTPACTION=0", "+HTTPACTION:0,200", 30000);
  if (answer == 1)

 {


  Serial.println(F("Done!"));

 }

  else

  {

  Serial.println(F("Error getting url"));

  }


   }

 else

 {

 Serial.println(F("Error setting the url"));



 }

 }

 else

 {

 Serial.println(F("Error setting the CID"));

 }

 }

 else

 {

  Serial.println(F("Error initializating"));

  }


  sendATcommand("AT+HTTPTERM", "OK", 5000);


  }


  void power_onSMS(){

  uint8_t answer=0; // checks if the module is started

  answer = sendATcommand("AT", "OK", 2000);  if (answer == 0)

  {

    // power on pulse digitalWrite(onModulePin,HIGH); delay(3000); digitalWrite(onModulePin,LOW);

   // waits for  an  answer from the module
   while       
    (answer ==  0    ){    

     answer = sendATcommand("AT", "OK", 2000);

       }

     }

      }


      void sendSMS(){ sendATcommand("AT+CPIN=****", "OK", 2000);


     delay(3000);


   Serial.println("Connecting to the network...");


   while( (sendATcommand("AT+CREG?", "+CREG: 0,1", 500) ||   sendATcommand("AT+CREG?", "+CREG: 0,5", 500))




  Serial.print("Setting SMS mode..."); sendATcommand("AT+CMGF=1", "OK", 1000); // sets theSMS mode to text 
   Serial.println("Sending SMS");


  sprintf(aux_string,"AT+CMGS=\"%s\"", phone_number); answer = sendATcommand(aux_string, ">", 2000); //

 send the SMS number  if (answer == 1)

 {

   Serial.print("Theft Alert:");

   Serial.print("Latitude: ");  int i = 0;  while(latitude[i]!=0){

  Serial.print(latitude[i]);

  i++;

 }

 Serial.print(" / Longitude: "); i = 0;

 while(longitude[i]!=0){ Serial.print(longitude[i]);


i++;

}

Serial.write(0x1A);

answer = sendATcommand("", "OK", 20000);  if (answer == 1)

{

Serial.print("Sent ");

}

 else

{

 Serial.print("error ");

}

 }

 else

{

Serial.print("error "); Serial.println(answer, DEC);

 }


}

1 ответ

Если вы двигаете функцию

int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int    timeout)

перед первым использованием (перед функцией setup()) он должен работать.

Другие вопросы по тегам