2016-10-18 253 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; 
       } 
      } 
     } 
    } 
}