2016-10-18 1 views
0

Ich habe ein Gerät, das ich brauche, um eine Verbindung mit SerialPort herzustellen. Dieses Gerät empfängt Befehle von meiner Seite und sendet auch Daten an mich. Ich mache alle senden/empfangen in der gleichen Klasse => gleichen Thread.wie in serialPort in der gleichen Zeit zu schreiben und zu lesen?

Ich wurde mit diesem Gerät verbunden und es ist mir gelungen, Befehl und Daten von/zu diesem Gerät zu senden/zu empfangen.

Einer der Befehle, die ich alle 25 Millisekunden senden muss, ist "gib mir deinen Status" - das bedeutet, dass ich das Gerät bitten, zurück senden einige Struktur mit Daten.

Für den Fall, dass ich einige empfangene Daten ... wenn ich 'serialPortStream.BytesToRead' (testen, ob es einige Daten zu bekommen) gibt, finde ich auf meinem ByteReading den älteren Puffer, den ich noch nicht rad? Wie viele Pakete habe ich für den Fall, dass ich das letzte Paket, das ich lesen musste, verpasste oder die neuen Daten die alten Daten löschen, die bereits empfangen wurden?

+0

Sie benötigen zwei Threads. Ich würde eine Klasse mit einem Ereignishandler zB SerialPort.DataRecieved + = ____ erstellen, die eine ConcurrentQueue auffüllt, wann immer ein neues Byte empfangen wird. Sie können dann aus dieser Warteschlange in Ihrem Hauptthread lesen und von dort aus schreiben. Beachten Sie, dass Ihre Pakete möglicherweise nicht in Ordnung sind, Sie aber keines verpassen werden. – rolls

Antwort

2

Verwenden Sie einen OnRecieveData-Handler, der die Daten in einer ConcurrentQueue oder ähnlichem speichert.

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; 
       } 
      } 
     } 
    } 
} 
Verwandte Themen