2017-06-09 9 views
-1

これは現在モデムにUSSDコードを送信しようとしているコードです。USSDコードのATコマンド

static void __display_data_balance(void) { 
     const STR* vodacomUSSD = "*111*502#"; 
     const STR* mtnUSSD = "*141*1#"; 
     const STR* cellcUSSD = "*101#"; 
     const STR* telkomUSSD = "*188#"; 
     const STR* virginMobileUSSD = "*101#"; 

     USHORT state; 
     USHORT error = SSD_STATE_GOOD; 
     BOOL done = FALSE; 

     USHORT size = 0; 
     STR* ussdCommand = NULL; 

     BYTE length; 
     BYTE buffer[64]; 

     for (state = 1; !error && !done; state++) { 
     printf("[__display_data_balance] state = %d\n", state); 
     printf("Buffer = %s\n", buffer); 
     switch (state) { 
      default: 
       error = SSD_STATE_CORRUPT; 
       break; 

      case 1: 
       //error = CTOS_GSMOpen(115200, TRUE); 
       break; 

      case 2: 
       error = CTOS_GSMQueryOperatorName(buffer, &length); 
       break; 

      case 3: 
       printf("[__display_data_balance] buffer = %s\n", buffer); 
       printf("[__display_data_balance] length = %d\n", length); 
       CTOS_LCDGTextOut(110, 210, buffer, d_LCD_FONT_12x24, FALSE); 

       if (strncmp("\"VodaCom-SA\"", buffer, length) == 0) { 
        ussdCommand = (STR*) vodacomUSSD; 
       } else if (strncmp("\"MTN-SA\"", buffer, length) == 0) { 
        ussdCommand = (STR*) mtnUSSD; 
       } else if (strncmp("\"Cellc-SA\"", buffer, length) == 0) { 
        ussdCommand = (STR*) cellcUSSD; 
       } else if (strncmp("\"Telkom-SA\"", buffer, length) == 0) { 
        ussdCommand = (STR*) telkomUSSD; 
       } else if (strncmp("\"VirginMobile-SA\"", buffer, length) == 0) { 
        ussdCommand = (STR*) virginMobileUSSD; 
       } else { 
        error = SSD_STATE_NOT_IMPLEMENTED; 
       } 

       if (ussdCommand) { 
        sprintf(buffer, "AT+CUSD=1,\"%s\",15\r", ussdCommand); 
        error = CTOS_GSMSendATCmd(buffer, strlen(buffer), 2000); 
        //USHORT CTOS_GSMSendATCmd(BYTE *baCmd, ULONG ulLen, ULONG ulTimeout); 
       } 
       break; 

      case 4: 

       size = sizeof (buffer); 
       error = CTOS_GSMRecvData(buffer, &size); 
       //USHORT CTOS_GSMRecvData (BYTE *baData, USHORT *pusLen); 
       break; 

      case 5: 
       printf("[__display_data_balance] buffer = %s\n", buffer); 
       printf("[__display_data_balance] length = %d\n", length); 
       CTOS_LCDGTextOut(40, 270, buffer, d_LCD_FONT_12x24, FALSE); 

       //error = CTOS_GSMClose(); 
       break; 

      case 6: 
       done = TRUE; 

       break; 
     } 
私はそれが私が間違っているの私はプログラミングにかなり新しいですしてくださいと、いくつかの援助をしてください希望が何であるかを知っていただきたいと思い

私は機能全体を追加しました。

+1

問題は? – tilz0R

+0

うわー!誰かがまだモデムを使用していますか? – SGeorgiades

+0

@SGeorgiades電子機器へのワールドワイドなワイヤレス通信にGSMモデムの代わりに何を使用しますか?ピジョン投稿ですか? – Lundin

答えて

0

はい、これらの宣言で、あなたの代わりにsizeof(buffer)、またはいっそ...

#define BUFSIZE (64) 
    : 
    : 
BYTE buffer[BUFSIZE]; 
    : 
    : 
size = BUFSIZE; 
CTOS_GSMRecvData(buffer, &size);//Receive data from GSM module. 
    : 
    : 

の、64にsizeを設定したいと思うでしょう、うまくいけばそれはタイプミスです... ussCommandSTR*する必要があり、いいえSTR

また、どこうまくいけば、それはlength = strlen(buffer)のようなものです...または多分あなただけの長さが必要とされていないstrcmpを、使用する必要があります... lengthセットです。

strcmpファミリの関数を文字列定数と比較し、変数を最初に、文字列を2番目に設定すると、これはバグではありませんが、通常の規則です。 if (x == 1) ...、というよりも

0
CTOS_GSMRecvDataからの私の出力は、+ CUSD = 1にある

、 "111 * 502#"、12なく所望のデータのバランス

いくつかの事、あなたのことチェックすることができます。

  • AT + CUSDを発行して、迷惑な結果コードの表示の現状を読んでください。 AT
  • 問題+ CUSD = 1 + CUSD = 1 AT
  • 次号、 "111 * 502#" は、12
  • ますのでご注意くださいプレゼンテーションを可能にするために、ネットワークからの応答は非同期で、Iこれを処理するためにCTOS_GSMRecvDataが実装されることを望んでいます。
関連する問題