2016-10-18 255 views
0

我有一些設備需要使用SerialPort進行連接。 該設備接收來自我身邊的命令,並向我發送數據。 我在做同樣的課程所有的發送/接收=>相同的線程。如何在同一時間寫入和讀取serialPort?

我已經連接到這個設備,我成功地發送/從這個設備接收命令和數據。

我需要每隔25毫秒發送一條命令是'給我你的狀態' - 這意味着我要求設備發回一些帶有數據的結構。

如果我缺少一些接收數據...當我做'serialPortStream.BytesToRead'(測試是否有一些數據可以得到)我會在我的ByteReading上找到舊的緩衝區,但我還沒有放棄? 如果我錯過了需要閱讀的最後一個軟件包,或者收到的新數據將刪除之前收到的舊數據,我將在那裏安裝多少個軟件包?

+0

您需要兩個線程。我會創建一個事件處理程序的類,例如SerialPort.DataRecieved + = ____,只要收到一個新字節,它就會填充ConcurrentQueue。然後,您可以在主線程中從此隊列讀取數據,然後從那裏寫入數據。請注意,您的數據包可能無法正常工作,但您絕對不會錯過任何內容。 – rolls

回答

2

使用OnRecieveData處理程序將數據保存到ConcurrentQueue或類似的東西。

namespace Test 
{ class Program 
    { 
     const int bufSize = 2048; 
     static void Main(string[] args) 
     { 

      Byte[] buf = new Byte[bufSize]; 
      SerialPort sp = new SerialPort("COM1", 115200); 
      sp.DataReceived += port_OnReceiveData; // Add DataReceived Event Handler 

      sp.Open(); 

      // Wait for data or user input to continue. 
      Console.ReadLine(); 


      sp.Close(); 
     } 

     private static void port_OnReceiveData(object sender, SerialDataReceivedEventArgs e) 
     { 
      SerialPort port = (SerialPort) sender; 
      switch(e.EventType) 
      { 
       case SerialData.Chars: 
       { 
        Byte[] buf = new Byte[bufSize]; 
        port.Read(buf, 0, bufSize) 
        Console.WriteLine("Recieved data! " + buf.ToString()); 
        break; 
       } 
       case SerialData.Eof: 
       { 
        // means receiving ended 
        break; 
       } 
      } 
     } 
    } 
}