2016-06-20 19 views
0

GSMおよびGPSモデム用のarduinoプログラムです。このGPSモデムでは、GSMモデムの助けを借りてユーザーに場所を送信しますが、このエラーは継続的に発生します。ここ sendATCommandはこのスコープで宣言されていません

プログラム 私も ATCommandが答えint8_t SIM908モジュール ためであるプログラムのためにいくつかの変更後に何度も何度もこれを取得しています。

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

あなたの特定のエラーを見つけるためにコードのいくつかのページを読むのが好きではないので、[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を投稿してください。この場合はむしろ明白です(宣言する前に関数を使用していますが、これは必ずしも真実ではありません)。 – Anedar

+0

'' '#include" Sim908.h "' ''私は推測する –

+0

ボディが関心があれば、全体のコードは参照用に与えられていますが、画像のエラーを見ることができます。エラーはありませんが、このステートメントではエラー – rohitpanwar77

答えて

0

あなたが最初の使用(セットアップの前に()関数)の前に機能

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

を移動した場合、それが動作するはずです。

+0

を呼び出します。このステートメントを挿入すると、sendATcommandが定義されたdunctionに変更されますが、それをさらにcharに変更する必要があります – rohitpanwar77

関連する問題