2016-10-18 2 views
0

J'ai un périphérique dont j'ai besoin pour établir une connexion en utilisant SerialPort. Cet appareil reçoit des commandes de mon côté et m'envoie également des données. Je fais tous les envoyer/recevoir dans la même classe => même fil.comment écrire et lire à serialPort en même temps?

J'ai été connecté à cet appareil et j'ai réussi à envoyer/recevoir des commandes et des données depuis/vers cet appareil. L'une des commandes que j'ai besoin d'envoyer toutes les 25 millisecondes est 'donnez-moi votre statut' - cela signifie que je demande au périphérique d'envoyer une structure avec des données.

Au cas où je manquerais des données de réception ... quand je fais 'serialPortStream.BytesToRead' (test s'il y a des données à obtenir) trouverai-je sur mon ByteReading l'ancien tampon que je n'ai pas encore radé? combien de paquets j'aurai là au cas où j'ai raté le dernier paquet que j'avais besoin de lire ou peut-être les nouvelles données reçues supprimeront-elles les anciennes données déjà reçues?

+0

Vous avez besoin de deux threads. Je voudrais créer une classe avec un gestionnaire d'événements, par exemple SerialPort.DataRecieved + = ____ qui remplit un ConcurrentQueue chaque fois qu'un nouvel octet est reçu. Vous pouvez ensuite lire cette file d'attente dans votre fil principal et y écrire. Notez que vos paquets peuvent être hors service mais vous n'en manquerez aucun. – rolls

Répondre

2

Utilisez un gestionnaire OnRecieveData qui enregistre les données dans un ConcurrentQueue ou quelque chose de similaire.

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