2016-06-20 6 views
0

Il s'agit d'un programme arduino pour modem GSM et GPS. Dans ce modem GPS envoyer l'emplacement à l'utilisateur avec l'aide du modem GSM, mais obtenir cette erreur en continu.sendATCommand non déclaré dans cette portée

ici le programme Je reçois encore et encore, même après quelques changements pour le programme ATCommand est pour le module SIM908 int8_t réponse;

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); 

} 


} 

enter image description here

+0

Veuillez publier un [exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve), car personne n'aime lire plusieurs pages de code pour trouver votre erreur particulière. Dans ce cas, c'est plutôt évident (vous utilisez la fonction avant de la déclarer) mais ce n'est pas toujours vrai. – Anedar

+0

'' '#include" Sim908.h "' '' Je suppose –

+0

Le code entier est donné à titre de référence si un corps est intéressé, mais vous pouvez voir l'erreur dans l'image et j'ai utilisé la commande plusieurs fois au-dessus où il y a pas d'erreur, mais dans cette déclaration, il a appelé une erreur – rohitpanwar77

Répondre

0

Si vous déplacez la fonction

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

avant la première utilisation (avant que la fonction setup()) il devrait fonctionner.

+0

si j'insère cette instruction, alors il va changer la commande sendAT pour être une définition bien que, en plus je dois changer cela en char qui sera un problème – rohitpanwar77