2013-03-28 60 views
0

我試圖用連接到COM端口的GSM調制解調器發送和接收數據。 這裏是我的代碼的重要組成部分:C#:COM端口,GSM設備只是發回我發給他的信息

 SerialPort sp = new SerialPort(); 
     sp.PortName = "COM1"; 
     sp.BaudRate = 9600; 
     sp.DataBits = 8; 
     sp.Parity = Parity.None; 
     sp.StopBits = StopBits.One; 
     sp.ReadTimeout = 5000; 

       sp.Open(); 
       if (sp.IsOpen) 
       { 
        Console.WriteLine(sp.PortName + " is open"); 

        Console.WriteLine("Trying to write data"); 
        sp.Write("AT"); 
        Console.WriteLine("Data has been sent"); 

        Console.WriteLine("Trying to read data"); 
        char[] read = new char[200]; 
        sp.Read(read, 0, 20); 
        foreach (char chr in read) 
        { 
         Console.Write(chr); 
        } 
        Console.WriteLine(); 

       } 

我沒有得到任何錯誤,但GSM設備是剛剛送我回來不管我送他。在這種情況下AT。如果我發送「BOO」,他會發回「BOO」(儘管有時我只能得到第一個字母,我認爲這是因爲我讀取數據的方式,應該是單獨的線程否?我可以輕鬆地做到這一點後來)。

我期待他送我回「OK」,當我送他「AT」。

對於設備將我寄回給我的任何內容,有什麼解釋?我想這可能是因爲端口通信設置不正確,而我實際上沒有進入設備,只是將它發回給自己?

回答

2

您是否與PuTTY溝通過?您應該首先嚐試從終端應用程序(PuTTY Download Link)發送和接收數據以排除調制解調器本身的任何問題,然後繼續編寫應用程序進行通信。

至於代碼,你應該使用sp.WriteLine而不是sp.Write ...調制解調器需要看到一個換行符來知道你的命令已經完成。您可以使用sp.NewLine來設置換行符,以便它符合調制解調器需要查看的內容。或者,您可以將「\ r」附加到您正在編寫的任何AT命令中。

我使用的GSM調制解調器默認都有回聲,您可以通過發送'ATE0'來禁用回聲。當回聲開啓時,調制解調器將首先回應您發送的任何內容,然後它會發送回應。由於您閱讀數據的方式,我懷疑您看到了回聲而不是迴應。試試這個方法用於讀取數據:

//add this just before opening the port 
sp.DataReceived += new 
    SerialDataReceivedEventHandler(port_DataReceived); 

添加下面的方法要設置端口的方法外:

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    Console.WriteLine(port.ReadExisting()); 
} 
+0

謝謝你的答案,但我試圖發送ATE0,然後在。 我回來的答案是「ATE0AT」。看起來他無視我,只是迴應。 – Juicy

+0

更新的答案建議在編寫代碼與之交談之前使用PuTTY嘗試命令。 – Crake

+0

此外,請確保您使用sp.WriteLine而不是sp.Write – Crake

相關問題