C#開發終端式簡訊的原理和方法之實踐篇

來源:互聯網
上載者:User
實踐篇

  在整個開始的時候,你要準備以下軟硬體:

   硬體:西門子3508或C35系列手機一個
   西門子手機通訊資料線一條
   軟體:VS.NET(C#)
   簡訊編碼類別庫(PDUdecoding.cs)
   串口通訊類庫(JustinIO.cs)

  當所要求的軟硬體都準備好後,我們就可以正式開始了。下面以我自己的測試案例為大家詳細介紹。

   做什麼事情都應該有計劃,雖然我們的測試案例很簡單,但還是畫個簡單的流程圖:

  有了流程圖,還只是明白了程式怎麼運行,再看看介面,會讓你更心動的了。


圖二、簡訊終端C#版介面圖

  再不開始,就有人罵我了。下在我講的開發環境是在VS.NET(C#)中。COME GO,GO…

  步驟一、開啟VS.NET,建立項目->Visual C#項目->Windows應用程式,名稱中輸入你的工程名就行啦,我的是smsForCsharp

  步驟二、參照上面的介面圖,設計你的程式介面,下面是我程式中各控制項的主要屬性

控制項名稱 控制項Name屬性 說明
TextBox targetNumber 接收手機號碼
TextBox CenterNumber 簡訊中心號
TextBox smsState 傳送簡訊後,返回的資訊。注意設定控制項為多行
TextBox smsContent 簡訊內容,同樣,注意設定為多行
ComboBox ConnectPort 串連手機的連接埠,例:COM1\COM2
ComboBox ConnectBaudRate 串口串連的傳輸速率,在串口通訊中很重要的
Button btnSend 發送按鈕
Button btnConnect 連線按鍵,主要用於程式的初始化
Button btnExit 退出按鈕

  步驟三、將PDUdecoding.cs與JustinIO.cs拷入剛剛建立工程目錄,並開啟方案總管,右鍵添加現有項,選中兩個檔案就行了,這裡再開啟類別檢視,裡面是不是多了兩個類,JustinIO與SMS類啊,三,要是沒有,那你再試。


圖三,添加類後的類別檢視

  步驟四、引用命名空間,用代碼查看方式開啟Form1.cs(這裡以我電腦為準,如果你自己更改過,請以你電腦為準),在代碼前面加上

using JustinIO;
using SMS;
using System.IO;
using System.Text;

  步驟五、在smsFormCsharp類中,添加兩個欄位ss_port、sms,分別為JustinIO及SMS的對象,如下

  步驟六、添加串口初始化代碼,如下:

/// <summary>
/// 初始化串口
/// </summary>
public bool InitCom(string m_port, int m_baudrate)
{
 ss_port.PortNum = m_port;//串口號
 ss_port.BaudRate = m_baudrate;//傳輸速率
 ss_port.ByteSize = 8;//資料位元
 ss_port.Parity = 0;//
 ss_port.StopBits = 1;//停止位
 ss_port.ReadTimeout = 1000;//讀逾時
 try
 {
  if (ss_port.Opened)
  {
   ss_port.Close();
   ss_port.Open();
  }
  else
  {
   ss_port.Open();//開啟串口
  }
  return true;
 }
 catch(Exception e)
 {
  MessageBox.Show("錯誤:" + e.Message);
  return false;
 }
}

  將上述代碼直接拷入你的程式中,並確保添加在Main主函數的後面,按F5,調試應該沒什麼問題,不過上面還沒有實際任何看得見的功能,僅僅是開啟了串口而以。

  步驟七、開啟串口後,我們就應該初始化程式,取得手機的名牌,型號,以及簡訊中心號,雙擊連線按鍵,並把下面代碼拷入程式中:

/// <summary>
/// 初始化代碼,並擷取手機相關資訊
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnConnect_Click(object sender, System.EventArgs e)
{
 bool opened = InitCom(ConnectPort.SelectedItem.ToString(),Convert.ToInt32(ConnectBaudRate.SelectedItem.ToString()));//開啟並初始化串口
 bool Connected = false;
 if (opened)
 {
  ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMI\r")); //擷取手機品牌
  string response = Encoding.ASCII.GetString(ss_port.Read(128));
  if (response.Length > 0)
  {
   ConnectState.Text = response.Substring(10,7);
   Connected = true;
  }
  else
  {
   ConnectState.Text = "與手機串連不成功";
   Connected = false;
  }
  ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMM\r"));//擷取手機型號
  response = Encoding.ASCII.GetString(ss_port.Read(128));
  if(response.Length > 0)
  {
   ConnectState.Text =ConnectState.Text+ " " + response.Substring(10,5) + " 串連中......";
   Connected = true;
  }
  else
  {
   ConnectState.Text = "與手機串連不成功";
   Connected = false;
  }
  ss_port.Write(Encoding.ASCII.GetBytes("AT+CSCA?\r"));//擷取手機簡訊中心號
  response = Encoding.ASCII.GetString(ss_port.Read(128));
  if(response.Length > 0)
  {
   CenterNumber.Text = response.Substring(20,13);
   Connected = true;
  }
  else
  {
   Connected = false;
  }
  if (Connected == true)
  {
   btnConnect.Enabled = false;
   btnSend.Enabled = true;
  }
  else
  {
   btnConnect.Enabled = true;
   btnSend.Enabled = false;
  }
 }
}

  到這裡,你可以按F5,編譯調試,通過,在確保你的手機與電腦串連正常下,點擊連線按鍵看看,是不是像我的一樣,手機型號及簡訊中心號者正常顯示出來了。


圖四、串連後程式介面

  步驟八、看到上在的結果,是不是感覺到離成功傳送簡訊很近啦,看這麼長的文章,費了大家不少時間,再不亮出發簡訊部份,對不起大家了。

  雙擊發送按鈕,將下面代碼拷入程式中。

/// <summary>
/// 傳送簡訊
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSend_Click(object sender, System.EventArgs e)
{
 string decodedSMS = sms.smsDecodedsms(CenterNumber.Text,targetNumber.Text,smsContent.Text);
 byte[] buf =Encoding.ASCII.GetBytes(String.Format("AT+CMGS={0}\r",sms.nLength));
 ss_port.Write(buf);
 string response = Encoding.ASCII.GetString(ss_port.Read(128));
 string SendState = "";
 if( response.Length > 0 && response.EndsWith("> "))
 {
  ss_port.Write(Encoding.ASCII.GetBytes(String.Format("{0}\x01a",decodedSMS)));
  SendState = "發送成功!";
 }
 else
 {
  SendState = "發送失敗";
 }

 string Result = String.Format("{0},{1},{2},\n\r",targetNumber.Text,smsContent.Text,SendState);
 smsState.Text += Result;
}

  快按F5吧!神啊,快通過吧!不用求神了,已經通過了,現在你就可以發簡訊了,請確保手機可以正常串連電腦。按串連,然後填入你要的發送的目標手機號,並在內容中添入你要發送的內容,發送吧!成功了!成功了是這樣子的!看你的跟我的一樣嗎?


圖五、發送成功

  還有一些事 不要忘了,記得添加結束代碼。雙擊退出,添加下面代碼:

/// <summary>
/// 關閉串口,退出程式
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnExit_Click(object sender, System.EventArgs e)
{
 ss_port.Close();
 Application.Exit();
}

  到這裡都告一個段落了,所有的功能都完成了!不過由於這僅僅是一個示範用例,還有很多沒有考慮,像串口通訊中的,在實際操作不可這樣操作的,應該用多線程來處理,一個專門用來讀串口,一個專門用來寫串口。還有程式中很多防出錯代碼沒有添加進去,希望有心有朋友添加,並公布出來,這也是我寫這篇文章希望看到的結果。請勿將本程式直接用於實際中,真誠提醒你!

  終於寫完了,我也放鬆了許多,本來很早就應該完成了,因為一些個人原因,沒有及時寫完,向那些曾經問過我相關問題,沒有及時回複的朋友,抱歉一聲,希望你們繼續支援我!

  調試環境

  Windows 2000 Professional、Visual Studio.NET、西門子3508手機、西門子專用資料線

原文:http://jly.blog.hexun.com/trackback.aspx?articleid=3207223

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.