2015-02-19 2 views
1

У меня есть данные о serialportRecived, в которых есть 2 метода. LogFile регистрирует данные, а drawSetpoint рисует график.C# winforms, сохраняющее значение из numericupdown

public void serialPort1_DataRecived (object sender, SerialDataReceivedEventArgs e) 
     { 

      DateTime time = DateTime.Now; 
      string Rdata = serialPort1.ReadLine(); 
      LogFile(Rdata, (int)numericSetpoint.Value); 
      drawSetpoint(time,numericSetpoint.Value.ToString()); 


     } 

Оба метода принимает второй аргумент от управления NumericUpDown, который выглядит следующим образом

public void numericSetpoint_KeyPress(object sender, KeyPressEventArgs e) 
     { 
      if (e.KeyChar == 13) 
      { 

       if (serialPort1.IsOpen) 
       { 
        int setpoint = (int)numericSetpoint.Value; 
        //send to serial port .....      
       } 

Проблема заключается в том, оба метода в моих данных RECIVED событий чтения цифр, как я печатаю их. Например, если я напечатаю 150, LogFile покажет 1,15,150, а функция draw начнет рисовать 1,15,150. Я хотел бы, чтобы обе функции принимали значение из элемента управления numericSetpoint после нажатия клавиши ввода, чтобы получить все значение. Как я мог это сделать?

+0

Похоже, что он должен делать то, что вы хотите. Поместите точку останова внутри метода «KeyPress» и посмотрите, что «KeyChar» находится при каждом нажатии клавиши. Этот внутренний блок 'if' не должен выполняться, если нажата клавиша Enter, и я понятия не имею, что это будет. –

+0

Событие Keypress отлично работает. Проблема заключается в чтении значения с этими 2 функциями внутри события, связанного с данными. Они сразу читают значение, когда я начинаю печатать, поэтому они показывают 1,15,150. Я хотел бы прочитать все значение сразу после нажатия клавиши ввода. – paChow

ответ

0

Вы используете событие KeyPress. Вместо этого подумайте о том, чтобы использовать событие ValueChanged, которое срабатывает только при нажатии кнопки или пользователь покидает управление. https://msdn.microsoft.com/en-us/library/system.windows.forms.numericupdown.valuechanged%28v=vs.110%29.aspx

+0

Hm, событие ValueChanged срабатывает, как только я начинаю печатать, мне даже не нужно нажимать клавишу ввода для отправки значения. – paChow

0

Похоже, что ваше событие rx данных стреляет во время ввода текста. Я бы попробовал заполнить буфер в вашем rx-событии данных и удержаться на любом протоколировании или графике, пока вы не отправите свои данные. Существует множество «безопасных» способов сделать это, но основная логика такова:

byte[] buffer = new byte[MAX_BUFFER]; 
private volatile bool _ready = false; 
private Object _lock = new Object(); 

public void serialPort1_DataRecived (object sender, SerialDataReceivedEventArgs e) 
{ 

    DateTime time = DateTime.Now; 

    // Either read as bytes or convert string to bytes, add to your buffer 
    // string Rdata = serialPort1.ReadLine(); 

    lock(_lock) 
    { 
     if(_ready) 
     { 
      _ready = false; 
      var myData = your buffer as string 
      // clear buffer 
      LogFile(myData, (int)numericSetpoint.Value); 
      drawSetpoint(time,numericSetpoint.Value.ToString()); 
     } 
    } 

} 

... 

public void numericSetpoint_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == 13) 
    { 

     if (serialPort1.IsOpen) 
     { 
      int setpoint = (int)numericSetpoint.Value; 
      //send to serial port .....  
      lock(_lock) { _ready = true; }    
     } 
    } 
} 
+0

Спасибо за предложение, я попробую его и отчитаю. Я никогда раньше не использовал блокировку, так как я получаю данные каждые 100 мс от моего arduino, будет ли блокировка влиять на мой график (диаграмма)? – paChow

+0

Я получаю «bool», не является ссылочным типом, как того требует ошибка оператора блокировки. – paChow

+0

Извините, я обновил этот пример, чтобы быть более ясным. Сделайте объект и заблокируйте его. Все это предотвращает состояние гонки на флаг _ready. Для тестирования вы, вероятно, могли бы его опустить. –