2013-06-26 195 views
0

我試圖將一串AT命令發送到USB加密狗。我已成功寫入串口。但我沒有成功回讀。基本上我想要做的是發送讓我們說AT到加密狗,並在richtextbox中收到確定。接下來將發送來自另一個設備的信息到加密狗並在richtextbox中讀取它。在richtextbox中回讀AT命令響應

下面是我使用的代碼:

namespace WindowsFormsApplication5 
{ 
    public partial class Form1 : Form 
    { 
     SerialPort sp = null; //<---- serial port at form level 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

      // initialise port in form loadmyport.PortName = "COM3"; 
      sp = new SerialPort(); 
      sp.PortName = "COM8"; 
      sp.BaudRate = 115200; 
      sp.Parity = Parity.None; 
      sp.DataBits = 8; 
      sp.StopBits = StopBits.One; 
      sp.NewLine = System.Environment.NewLine; 
      sp.ReadTimeout = 2000; 
      sp.WriteTimeout = 2000; 
      sp.DtrEnable = false; 
      sp.RtsEnable = false; 
      sp.WriteBufferSize = 4096; 
      sp.ReadBufferSize = 4096; 
      sp.Handshake = Handshake.None; 
      sp.Encoding = System.Text.Encoding.ASCII; 

      // also set up baud rate etc here. 
      // attach event handler to capture data received 
      sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); 
     } 

     private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
     SerialPort sp = (SerialPort)sender; 
     string indata = sp.ReadExisting(); 
     Console.WriteLine("Data Received:"); 
     Console.Write(indata); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      connect.Enabled = false; 
      try 
      { 
       // open port if not already open 
       // Note: exception occurs if Open when already open. 
       if (!sp.IsOpen) 
       { 
        sp.Open(); 
       } 
       // send data to port 
       sp.Write("ATXXX,XXXXXXX\r\n"); 
       disconnect.Enabled = true; 
      } 
      catch (Exception) 
      { 

       // report exception to user 
       Console.WriteLine(e.ToString()); 
      } 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      connect.Enabled = true; 

      try 
      { 
       // open port if not already open 
       // Note: exception occurs if Open when already open. 
       if (!sp.IsOpen) 
       { 
        sp.Open(); 
       } 
       // send data to port 
       sp.Write("atXX,0\r\n"); 
      } 
      catch (Exception) 
      { 

       Console.WriteLine(e.ToString()); 
      } 
      finally 
      { 
       disconnect.Enabled = false; 
      } 
     } 


     public void OnApplicationExit(object sender, EventArgs e) 
     { 
      sp.Close(); 
     } 
    } 
} 
+0

您有一個datareceived處理程序(sp_DataReceived),爲什麼不使用它? – user2019047

+0

讓我更新我的帖子。我將此添加到接收到的數據處理程序中private void sp_DataReceived(object sender,SerialDataReceivedEventArgs e) {SerialPort sp =(SerialPort)sender; string indata = sp.ReadExisting(); Console.WriteLine(「Data Received:」); Console.Write(indata);仍然沒有看到任何東西。 –

+0

可能重複[SerialPort DataReceived事件不會觸發](http://stackoverflow.com/questions/8907490/serialport-datareceived-event-not-fire-c-console-application) –

回答

3

不要直接在你的主代碼讀取串口數據。對於數據接收事件,您有一個事件處理程序,它當前將響應寫入調試控制檯。所有你需要做的就是改變事件處理程序,將文本寫入你的富文本框。 (您已經準備好讀取數據並將其顯示在文本框中的代碼將不會顯示任何內容,因爲(a)port_DataRecieved看起來像從不訂閱任何事件,因此不會調用它,(b)您的sp_DataReceived事件處理程序正在讀取數據並將其記錄到調試輸出,因此任何嘗試讀取端口的其他代碼都會發現它爲「空」)

請注意,sp_DataReceived事件將在不同的線程上引發,而不會引發您的UI線程,因此您需要調用或BeginInvoke將控制權交還給UI線程以將文本添加到您的文本框中。

還請注意,您可能無法將響應作爲單個「數據包」進行獲取。它可能會分成幾個部分,因此您需要將每個傳入消息添加到文本框中的文本末尾,以便將來自所有部分的整個響應拼接在一起。

+0

謝謝傑森。不幸的是,C#是新手。可以給出一個如何執行調用並開始調用事物的要點。因爲我認爲收到的數據事件沒有被解僱。 –

+0

查看示例[here](http://msdn.microsoft.com/en-us/library/a06c0dc2.aspx) - 它非常接近你所需要的。如果事件沒有觸發,那麼你沒有收到數據 - 請參閱[這裏](http://stackoverflow.com/questions/8907490/serialport-datareceived-event-does-not-fire) - 你正在禁用DtrEnable和RtsEnable可能會阻止設備回覆您。在創建串行端口時,除非您知道*您需要更改它們,否則只應設置PortName,BaudRate,Parity,DataBits,StopBits,並且通常將其他所有值保留爲其默認值。 –

+0

謝謝@jasonWilliams。它在我將DtrEnable和RtsEnable設置爲true並添加一個Delegate方法之後起作用。我的第二個問題是,現在我發送數據包,他們在richtextbox中出現一些奇怪的字符。我必須將其轉換爲字節或東西? –