2016-01-03 2 views
1

Я работаю над приложением serialport. И я не могу правильно получать данные. Я использую ReadExisting() для чтения следующих данных. serialport- receiving missing data.NET serial-ports - получение отсутствующих данных

и вот мой код. Пожалуйста, совет, каков правильный способ получения данных, и что, если я хочу проверить длину каждого сообщения и действительность формата.

public void serialport_connect(String port, int baudrate, Parity parity, int databits, StopBits stopbits) 
     { 
      DateTime dt = DateTime.Now; 
      String dtn = dt.ToShortTimeString(); 

      sport = new System.IO.Ports.SerialPort(port, baudrate, parity, databits, stopbits); 

      try 
      { 
       sport.Open(); 
       status.AppendText("[" + dtn + "] " + "Connected\n"); 
       sport.DataReceived += new SerialDataReceivedEventHandler(sport_DataReceived); 
      } 
      catch (Exception ex) { MessageBox.Show(ex.ToString(), "Error"); } 
     } 

     private void sport_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
      DateTime dt = DateTime.Now; 
      String dtn = dt.ToShortTimeString(); 
      String comingData = sport.ReadExisting(); 

      if (comingData != String.Empty) 
      { 
       Dispatcher.Invoke(new Action(() => 
       { 
        current.AppendText("[" + dtn + "] " + "Received: " + sport.ReadExisting() + "\n"); 
       })); 
      } 

     } 

Thank you.

ответ

2

Ваш цикл событий намного быстрее, чем время, требуемое для отправки одного символа со скоростью 9600 бод. Я бы рекомендовал добавлять полученные символы в строку до тех пор, пока вы не получите завершающий символ типа «\ n» или получите количество ожидаемых символов.

Вот пример из проекта, где я жду, пока я не получаю 10 символов:

int datalen = serialPort1.BytesToRead; 
label1.Text="Readexisting"; 
if (datalen >=10) 
{ 
    string data = serialPort1.ReadExisting(); 
    label1.Text=data; 
}