2009-07-31 64 views
0

我正在通過AT命令與GSM手機發送短信。我想發送數千條消息。我通過GSM移動閱讀我們可以每分鐘發送6-8個短信。但是當我發送消息時,有人會去,而不是有人。我從excel文件獲取信息意味着目標號碼和消息文本。你能告訴我爲什麼有些短信正在進行,有些則沒有。我的代碼是短信通過AT命令與GSM手機給出錯誤

 SmsFields smsObj = null; 
     List<SmsFields> smsColl = null; 
     SerialPort serialport = null; 
     StringBuilder strbuild = new StringBuilder(); 
     try 
     { 
      //Validate the form 
      if (!Validation()) return; 

      serialport = new SerialPort(); 

      ////Sets the properties of serial port object 
      serialport.PortName = cboPort.SelectedItem.ToString(); 
      serialport.BaudRate = 9600; 
      serialport.Parity = Parity.None; 
      serialport.DataBits = 8; 
      serialport.StopBits = StopBits.One; 
      serialport.Handshake = Handshake.RequestToSend; 
      serialport.DtrEnable = true; 
      serialport.RtsEnable = true; 

      //Open the port to send sms 
      serialport.Open(); 

      //Check if port is opened or not 
      if (!serialport.IsOpen) 
      { 
       MessageBox.Show("Serial port is not opened. Please try with other port"); 
       return; 
      } 

      //Create smsFields class's object and fill the data in the generic collection 
      smsObj = SmsFields.Instance; 
      smsColl = smsObj.FillData(txtFilePath.Text); 

      if (smsColl == null) 
      { 
       MessageBox.Show("No data found in the excel table"); 
       return; 
      } 
      //Gets the single record from SmsFields class and sends the message 
      foreach (SmsFields sms in smsColl) 
      { 

       //checks phone status 
       serialport.WriteLine("AT" + Environment.NewLine); 
       //Configures message as SMS (0 for PDU format) and (1 for text format) 
       serialport.WriteLine("AT+CMGF=1" + Environment.NewLine); 

       //Sets message center number 
       serialport.WriteLine("AT+CSCA=\"" + txtServiceNo.Text + "\"" + Environment.NewLine); 

       //Sets destination number 
       serialport.WriteLine("AT+CMGS=\"" + sms.DestinationNo + "\"" + Environment.NewLine); 

       //Specifies message and sends Ctrl+z 
       serialport.WriteLine(sms.Message + (char)26); 

       //Displays buffer containing output messages 
       System.Threading.Thread.Sleep(4000); 
    } 

回答

1

我覺得你的問題是,你不發送下一個命令之前等待最後的結果代碼(即OK,ERROR和其他一些)。問題在於如果新命令未完成,將觸發正在進行的命令的中止。引述V.250

5.6.1中止命令

...

中止命令 由來自DTE的 傳輸到任何字符的DCE 完成。

所以ALWAYS發送AT命令時,你MUST等待最終結果代碼發送下一個命令。

也許我建議重構serialport.WriteLine("ATxxx" + Environment.NewLine)sendCommand(serialport, "ATxxx")功能?然後,您可以在該函數的末尾添加等待最終結果代碼。

0

嘗試查看是否存在未發送消息的模式。因爲那麼消息中的數字格式或無效字符可能有問題。

此外,一些注意事項:

  1. 你沒有做任何錯誤檢查。我會確保在調用每個命令後得到了預期的答覆。

  2. 您正在使用Environment.NewLine完成每一行。我認爲這是一個隨底層操作系統而變化的屬性。然而AT標準清楚地明確了用於終止命令行的字符。

  3. 手機是真正的混蛋。僅僅因爲你遵循規範或文檔並不意味着他們這樣做。假設每個手機型號的行爲都不同於其他手機型號。看點1

+0

感謝您的回覆,但正如我寫的那樣,有些短信正在發送,有些顯示發送錯誤。那麼背後的原因是什麼?因爲我發送了大量的短信。我收到了每個命令的回覆。 serialport.ReadExisting(); 你能告訴我,爲什麼有些短信會回覆'OK',有些不會回覆'錯誤'? – Deepak 2009-07-31 06:45:28