2015-03-20 2 views
0

Я пытаюсь прочитать данные из последовательного порта. Он считывает данные, когда я устанавливаю точку останова.Данные последовательного порта Получены только при установке контрольной точки C#

Я пробовал с родительским делегатом invoke, некоторые задержки также. Это не работает для меня.

Вот мой код

Чтение кода из файла класса:

 public void comport_DataReceived2(object sender, SerialDataReceivedEventArgs e) 
     { 
      var bytes = comport.BytesToRead; 
      var buffer = new byte[bytes]; 
      string test2 = comport.ReadExisting(); 
      if (IsReadPDSS) 
      { 
       if(test2 != string.Empty && test2 != " " && test2.Length > 30) 
       { 
        test2 = test2.Substring(30); 
        test2.Replace("000000000000P0000W", ""); 
        strReceived += test2; 
       } 
      } 
      else 
      { 
       strReceived = test2; 
      } 
     } 

окна образуют retriving чтения данных:

строка сс = FormObj.strReceived.ToString();

+0

Ваша '' test2.Length> 30'' в условии if может объяснить, что вы получаете разные результаты при использовании контрольных точек. При отладке вы, скорее всего, собираете более «существующие» данные по сравнению с полным запуском. Следовательно, ваше предложение if истинно во время отладки, но не при нормальной работе, так как вы получите это событие до прибытия 30 символов. Измените его на «байты> 30», если вы посмотрите на эту сумму и переместите вызов '' comport.ReadExisting() 'внутри поля if вместе с удалением других предложений в инструкции if, относящихся к test2. – BitTickler

+0

привет, очень спасибо. он работает. Спасибо за вашу своевременную помощь – Raaga

ответ

0

Когда вы выполняете отладку приложения, ваша система не полностью заморожена. Только приложение, которое вы отлаживаете. Таким образом, пока ваше приложение находится в точке останова, все еще накапливаются входящие данные на последовательном порту.

Управляющий поток немного нечеткий (возможно, потому, что вы несколько раз его изменяли при поиске проблемы). Как уже написано, вы считываете данные из последовательного порта всякий раз, когда возникает событие. В то время, когда вы читаете данные, маловероятно, что 30 байт. Если вы входите в отладчик и выполняете одиночный степпинг, скорее всего вы найдете более 30 байт в буфере приема (в зависимости от того, что передает ваше устройство).

Таким образом, лучший способ, чтобы написать поток управления будет выглядеть следующим образом:

public void comport_DataReceived2(object sender, SerialDataReceivedEventArgs e) 
{ 
    var bytes = comport.BytesToRead; 
    if(bytes > 30) 
    { 
     var test2 = comport.ReadExisting(); 
     // additional testing code as required... 
    } 
} 

В зависимости от того, как работает повышение поведение события, возможно, потребуется, чтобы накопить данные координат, сами в дополнительном буфере, если событие не получает повторного поднятия после того, как его уволили в первый раз ... Но это должно быть достаточно легко проверить и адаптировать.