2013-03-14 48 views
1

我想建立一個簡單的應用程序,返回通過調制解調器呼叫的號碼,但我似乎只是從調制解調器接收數據的第一行。C#電話號碼接收器

當我運行超級終端,通過AT#CID = 1級的命令,環數,我得到一個完整的輸出:

OK

DATE = 0314

TIME = 1111

NMBR = 4936

NAME =斯圖爾特Ë

在我的應用程序中,我似乎只收到包含「確定」部分的第一部分。任何幫助我在做什麼錯誤或缺少?

代碼:

public partial class Form1 : Form 
{ 
    public SerialPort port = new SerialPort("COM3", 115200,Parity.None,8,StopBits.One); 
    public String sReadData = ""; 
    public String sNumberRead = ""; 
    public String sData = "AT#CID=1"; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void btnRun_Click(object sender, EventArgs e) 
    { 
     SetModem(); 

     ReadModem(); 

     MessageBox.Show(sReadData); 
    } 

public void SetModem() 
    { 

     if (port.IsOpen == false) 
     { 
      port.Open(); 
     } 

     port.WriteLine(sData + System.Environment.NewLine); 
     port.BaudRate = iBaudRate; 
     port.DtrEnable = true; 
     port.RtsEnable = true; 

    } 

    public string ReadModem() 
    { 

     try 
     { 
      sReadData = port.ReadExisting().ToString(); 

      return (sReadData); 
     } 
     catch (Exception ex) 
     { 
      String errorMessage; 
      errorMessage = "Error in Reading: "; 
      errorMessage = String.Concat(errorMessage, ex.Message); 
      errorMessage = String.Concat(errorMessage, " Line: "); 
      errorMessage = String.Concat(errorMessage, ex.Source); 

      MessageBox.Show(errorMessage, "Error"); 
      return ""; 
     } 
    } 

    private void btnExit_Click(object sender, EventArgs e) 
    { 
     port.Close(); 
     Close(); 
    } 
} 
} 
+0

不知道這是否是問題,但在MSDN上,'readexisting'似乎返回一個字符串反正所以不知道多少'的ToString()'需要 – Sayse 2013-03-14 11:30:26

+0

你在超級終端使用哪些設置?確保在你的應用程序中使用相同的。 – ellak 2013-03-15 02:30:48

+0

你不妨看看我的問題http://stackoverflow.com/questions/5897916/callerid-detection-doesnt-work-with-some-phones – Marshal 2013-03-15 06:23:01

回答

1

ReadModem()嘗試使用port.ReadLine()在一個循環,而不是和循環,直到你得到一個行說RING(如果這是您所期望的最終線)。

+0

我試過了一個循環,但仍然只有「OK」 – Stuart1044 2013-03-14 11:46:03

+0

你能用循環顯示代碼嗎? – ellak 2013-03-14 11:50:13

+0

好吧,所以我改變ReadModem()有以下幾點: while(sReadData!=「RING」) { sReadData + = port.ReadLine(); } 但是當通過sReadData循環時,只能設置爲「OK」,之後它似乎停止一起讀取 – Stuart1044 2013-03-14 11:55:48

1

設置之後,您只需讀取調制解調器一次。您需要在serialPort上訂閱DataReceivedEvent以不斷從端口獲取數據。

public void SetModem() 
    { 

     if (port.IsOpen == false) 
     { 
      port.Open(); 
     } 

     port.WriteLine(sData + System.Environment.NewLine); 
     port.BaudRate = iBaudRate; 
     port.DtrEnable = true; 
     port.RtsEnable = true; 

     port.DataReceived += port_DataReceived; 

    } 

    void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
      //For e.g. display your incoming data in RichTextBox 
      richTextBox1.Text += this.serialPort1.ReadLine();   

      //OR 
      ReadModem(); 
    } 
+0

我已將DataReceived部分添加到SetModem()並添加了一個RichtextBox ,但這不會填充任何東西....我需要擺脫ReadModem()函數? – Stuart1044 2013-03-14 11:46:51

+0

@Startart1044在DataReceived事件中放置斷點並檢查接收RING時是否觸發dataReceived事件。 – Marshal 2013-03-14 11:55:37

+0

嗯,它只是跳過它,所以port.DataReceived沒有設置,爲什麼會發生任何想法? – Stuart1044 2013-03-14 11:58:49