實踐篇
在整個開始的時候,你要準備以下軟硬體:
硬體:西門子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