2016-10-18 7 views
0

У меня есть устройство, которое мне нужно сделать с помощью SerialPort. Это устройство принимает команды с моей стороны, а также отправляет мне данные. Я делаю все send/receive в том же классе => тот же поток.как писать и читать в serialPort в одно и то же время?

Я подключен к этому устройству, и мне удастся отправить/получить команду и данные с/на это устройство.

Одна из команд, которые мне нужно отправить каждые 25 миллисекунд, - это «дать мне свой статус» - это означает, что я прошу отправить устройство обратно с какой-либо структурой с данными.

В случае, если я пропущу некоторые принимаемые данные ... когда я делаю «serialPortStream.BytesToRead» (проверьте, есть ли какие-то данные для получения), я найду на моем байтеReading более старый буфер, который я еще не рад? Сколько пакетов у меня будет там, если я пропустил последний пакет, который мне нужно было прочитать, или, может быть, новые полученные данные удалят старые данные, полученные ранее?

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