簡體   English   中英

無法使用gsm調制解調器通過System.IO.Ports通過C#代碼發送SMS

[英]Unable to send SMS through C# code using System.IO.Ports using gsm modem

單擊按鈕后,會將短信發送到NumTxt文本框中輸入的號碼,然后發送在SMSTxt文本框中輸入的文本。 在texbox ComPort中輸入的端口名稱這是按鈕單擊事件的事件處理程序。

  using System.IO.Ports;

  private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            int mSpeed = 1;
            serialport.PortName = ComPort.Text;
            serialport.BaudRate = 96000;
            serialport.Parity = Parity.None;
            serialport.DataBits = 8;
            serialport.StopBits = StopBits.One;
            serialport.Handshake = Handshake.XOnXOff;
            serialport.DtrEnable = true;
            serialport.RtsEnable = true;
            serialport.NewLine = Environment.NewLine;
            Console.WriteLine("1a");
            try
            {
                serialport.Open();
            }
            catch (Exception)
            {
                MessageBox.Show("Try another Port." + 
    Environment.NewLine + "Phone not detected or The requested resource is in      
    use.", "CONNECTION ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            Console.WriteLine("2a");

            serialport.WriteLine("AT+CMGF=1" + Environment.NewLine);
            System.Threading.Thread.Sleep(200);
            serialport.WriteLine("AT+CSCS=GSM" + Environment.NewLine);
            System.Threading.Thread.Sleep(200);
            serialport.WriteLine("AT+CMGS=" + (char)34 + NumTxt.Text
            + (char)34 + Environment.NewLine);
            System.Threading.Thread.Sleep(200);
            serialport.WriteLine(SMSTxt.Text + (char)26);
            System.Threading.Thread.Sleep(mSpeed);
            serialport.Close();

        }
        catch (Exception)
        {
            if (serialport.IsOpen)
                serialport.Close();
            MessageBox.Show("Couldn't send the SMS.", "CONNECTION ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

我昨天能夠使用此代碼發送短信,但我不知道為什么它不再起作用..沒有引發異常。 使用gsm調制解調器隨附的軟件時,我可以發送短信。 但不是通過C#代碼。 如果有人能指出以上代碼中的錯誤,我將非常感謝。

永遠不要,永遠不要使用睡眠代替等待調制解調器的最終結果代碼。 就像您不會編寫一個完全忽略來自http服務器的所有響應的http客戶端一樣,您也不應將AT命令發送到調制解調器並完全忽略它返回的響應。 您必須閱讀並解析調制解調器發送回給您的所有內容。 沒有其他東西可以可靠地工作了。

我的建議是,首先獲取V.250標准的副本,並至少閱讀第5章的全部內容。該標准是AT命令處理的聖經,將教給您大量有關AT命令處理的知識。 例如,使用WriteLine和/或Environment.NewLine是錯誤的; AT命令行應僅以\\r終止,而不能有其他終止。


只是為了強調該文檔的重要性:即使在愛立信的手機中實施了AT命令之后,我和我的同事們仍然定期查閱該標准

實際上,現在停止在此處閱讀此答案, 下載該文檔,閱讀第5章的全部內容,然后再返回閱讀其余內容。


對於不特別關心響應1的命令 ,唯一可靠的方法是執行以下操作:

serialport.Open();
...
// start sending AT+CMGF=1
serialport.Write("AT+CMGF=1\r");
do {
    line = readLine(serialport);
} while (! is_final_result_code(line))
// Sending of AT+CMGF=1 command finished (successfully or not)
...
serialport.Close();

其中readLine函數從串行端口讀取一個字節和一個字節,直到它收到以\\r\\n終止的完整行,然后返回該行。

您可以查看atinout的代碼, 獲取is_final_result_code函數的示例(您還可以將其與ST-Ericsson的U300 RIL中的 isFinalResponseErrorisFinalResponseSuccess 2進行比較)。

AT + CMGS命令必須以不同的方式處理。 發送有效負載之前,您必須等待調制解調器的"\\r\\n> "響應,有關詳細信息,請參見此答案的第一部分。


1盡管您很可能應該關心命令是否成功執行。 請參閱此答案 ,以獲得發送命令行和解析響應行的實際方法。

2請注意, CONNECT不是最終結果代碼,它是中間結果代碼,因此嚴格來說,名稱isFinalResponseSuccess並非100%正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM