2016-09-23 3 views
1

나는 simdul을 사용하여 arduino UNO와 통화 할 때 AT commands을 사용합니다. 이 library을 사용하여 gprsTest.callUp(number) 기능을 호출합니다. 문제는 번호가 잘못되었거나 크레딧이없는 경우에도 true을 반환한다는 것입니다.SIM800l 라이브러리를 편집하여 전화를 걸 수있는 방법

이 부분 코드는 GPRS_Shield_Arduino.cpp library에서 분명합니다. 그것은 ATDnumberhere;

bool GPRS::callUp(char *number) 
{ 
    //char cmd[24]; 
    if(!sim900_check_with_cmd("AT+COLP=1\r\n","OK\r\n",CMD)) { 
     return false; 
    } 
    delay(1000); 
    //HACERR quitar SPRINTF para ahorar memoria ??? 
    //sprintf(cmd,"ATD%s;\r\n", number); 
    //sim900_send_cmd(cmd); 
    sim900_send_cmd("ATD"); 
    sim900_send_cmd(number); 
    sim900_send_cmd(";\r\n"); 
    return true; 
} 
의 반환을 확인 나던

소프트웨어 시리얼 통신에 ATDnumberhere;의 반환은 다음과 같습니다에는 신용

`MO CONNECTED //instant response 

    +COLP: "003069XXXXXXXX",129,"",0,"" // after 3 sec 

    OK` 

이없는 경우

수는 ERROR

잘못되면 전화가 걸려 있고 대답이없는 경우

MO RING //instant response, it is ringing 

NO ANSWER // after some sec 

가 호출하고 호출하는 경우 수신기가 캐리어를

ATD6985952400; 

NO CARRIER 

을하지 않은 경우, 답을

MO RING //instant response 

NO CARRIER // after some sec 

을 끊고 끊으 경우

MO RING 

MO CONNECTED 

+COLP: "69XXXXXXXX",129,"",0,"" 

OK 

NO CARRIER 

질문은 다른 반환 f를 사용하는 방법입니다 또는이 함수에 의해 모든 경우 gprsTest.callUp(number), 또는 적어도 울리는 경우 true를 반환하는 방법?

답변

1

이 라이브러리 코드는 언뜻보기에는 최악 이었지만 여전히 문제가 있습니다. 가장 심각한 것은 최종 결과 코드 처리입니다.

sim900_check_with_cmd 기능은 개념적으로 거의 존재하지만, OK을 검사하는 것만으로는 적합하지 않습니다. 그것은 모뎀이 보낼 수있는 최종 결과 코드마다 을 확인해야합니다. 당신의 출력 예에서 당신은

  • ERROR
  • NO CARRIER
  • NO ANSWER
  • 만이 존재 몇 가지 더뿐만 아니라

    • OK 다음 최종 결과 코드가 있습니다. atinout의 코드는 is_final_result_code 함수의 예를 볼 수 있습니다 (isFinalResponseErrorisFinalResponseSuccessST-Ericsson's U300 RIL).

      무조건 return true;GPRS::callUp이면 오류이지만 호출 클라이언트가 중간 결과 코드를 확인할 수 있도록 더 나은 API를 구현하기위한 아이디어가 없기 때문에 고의적 인 내용 일 수 있습니다. 하지만 그렇게하는 것은 잘못된 방법입니다. 라이브러리는 예외없이 모든 상태 저장 명령 줄 호출과 최종 결과 코드 구문 분석을 실제로 수행해야합니다. 라이브러리에서 그 부분을 수행하고 일부를 클라이언트에 남겨 두는 것은 잘못된 디자인 일뿐입니다.

      클라이언트가 명령 줄과 최종 결과 코드 사이에 오는 중간 결과 코드 나 정보 텍스트를 검사하거나 실행하려는 경우 올바른 방법은 라이브러리에서 모뎀에서받은 모든 내용을 "deframe" 개별적인 전체 라인으로, 그리고 최종 결과 코드가 아닌 모든 것에 대한 코드는 콜백 함수를 통해 이것을 클라이언트에 제공합니다.

      다음은 내 atinout 프로그램 미완성 업데이 트에서입니다 :

      bool send_commandline(
           const char *cmdline, 
           const char *prefix, 
           void (*handler)(const char *response_line, void *ptr), 
           void *ptr, 
           FILE *modem) 
      { 
           int res; 
           char response_line[1024]; 
      
           DEBUG(DEBUG_MODEM_WRITE, ">%s\n", cmdline); 
           res = fputs(cmdline, modem); 
           if (res < 0) { 
             error(ERR "failed to send '%s' to modem (res = %d)", cmdline, res); 
             return false; 
           } 
      
           /* 
           * Adding a tiny delay here to avoid losing input data which 
           * sometimes happens when immediately jumping into reading 
           * responses from the modem. 
           */ 
           sleep_milliseconds(200); 
      
           do { 
             const char *line; 
             line = fgets(response_line, (int)sizeof(response_line), modem); 
             if (line == NULL) { 
               error(ERR "EOF from modem"); 
               return false; 
             } 
             DEBUG(DEBUG_MODEM_READ, "<%s\n", line); 
             if (prefix[0] == '\0') { 
               handler(response_line, ptr); 
             } else if (STARTS_WITH(response_line, prefix)) { 
               handler(response_line + strlen(prefix) + strlen(" "), ptr); 
             } 
           } while (! is_final_result(response_line)); 
      
           return strcmp(response_line, "OK\r\n") == 0; 
      } 
      

      당신이 사용할 수있는 적절한 처리를 구현하기위한 기초로. 당신이 하려는 기능에서 오류 응답을받을 경우, 추가 콜백 인수를 추가로

       success = strcmp(response_line, "OK\r\n") == 0; 
           if (!success) { 
             error_handler(response_line, ptr); 
           } 
           return success; 
      

      팁 변경 : V.250 사양에 5 장을 모두 읽고, 그것은 당신에게 거의 모든 것을 가르 칠 것입니다 당신 명령 줄, 결과 코드 및 응답 처리에 대해 알아야합니다. 같은 명령 줄도 \ronly하지 \r\n 종료해야한다는 예를 들면 -


      1CONNECT, 그것은 중간 결과 코드 최종 결과 코드 아니므로 이름 isFinalResponseSuccess이다하는 것으로 엄밀히 말하면 100 % 정확하지 않습니다.