2016-11-02 18 views
0

Modbus 명령을 사용하여 읽은 실시간 온도를 그래프로 표시하려고합니다. 현재 온도를 읽고 그래프로 볼 수 있습니다. 그러나 첫 번째 점을 그리면 그래프와 GUI가 지속적으로 업데이트되지 않습니다.Windows 폼 응용 프로그램에서 실시간 그래프 작성

나는 Form1_Load 이외의 방법이 실행해야 하는가?

private void Form1_Load(object sender, EventArgs e) 
{ 
    chart1.ChartAreas.Add("Area"); 
    chart1.ChartAreas["Area"].AxisX.Minimum = -100; 
    chart1.ChartAreas["Area"].AxisX.Maximum = 100; 
    chart1.ChartAreas["Area"].AxisX.Interval = 1; 
    chart1.ChartAreas["Area"].AxisY.Minimum = -100; 
    chart1.ChartAreas["Area"].AxisY.Maximum = 100; 
    chart1.ChartAreas["Area"].AxisY.Interval = 1; 

    //create a Data object array 
    val[] data = new val[5]; 

    string[] ports = SerialPort.GetPortNames(); 
    this.comboBox1.DataSource = ports; 
    serialPort1.PortName = "COM5"; 
    using (SerialPort port = new SerialPort("COM5")) 
    { 
     //start time object 
     DateTime start = DateTime.Now; 
     int startSec = start.Second; 

     port.Open(); 
     byte slaveID = 1; 
     ushort startAddress = 360; 
     ushort numOfPoints = 2; 
     ModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port); 

     for (int j = 0; j < 5; j++) 
     { 
      ushort[] holding_register = master.ReadHoldingRegisters(slaveID, startAddress, 
      numOfPoints); 

      ushort val1 = holding_register[0]; 
      ushort val2 = holding_register[1]; 

      uint t1 = (uint)(holding_register[0]); 
      uint t2 = (uint)(holding_register[1] << 16); 
      uint temp = (uint)(t1) | (t2); 
      byte[] floatVals = BitConverter.GetBytes(temp); 
      float f = BitConverter.ToSingle(floatVals, 0); 
      c = 5.0/9.0 * (f - 32); 

      textBox1.Text = c.ToString(); 

      DateTime current = DateTime.Now; 
      int currentSec = current.Second; 
      int time = currentSec - startSec; 

      chart1.Refresh(); 

      data[j].time = time; 
      data[j].temperature = c; 

      chart1.Series[j].Points.Add(new DataPoint(data[j].time, data[j].temperature)); 

      chart1.Refresh(); 

      port.Close(); 
     } 
    } 
} 
+0

이것은 근본적인 newb 문제입니다. 창 응용 프로그램에는 지정된 UI 스레드가 있습니다. 메시지 펌프 (사용자가 창을 클릭 할 때처럼 처리하는)를 실행하고 창의 시각적 표현을 그립니다. UI 스레드에서 작업하고 있습니다. 일반적으로 괜찮습니다.하지만 UI 스레드에서 많은 작업을 할 때 UI 스레드는 더 이상 메시지 펌프를 실행하거나 창을 그릴 수 없습니다. 응용 프로그램이 정지 된 것처럼 보입니다. 작업이 끝나면 업데이트 만됩니다. 이것이 우리가 배경 스레드 *에 많은 노력을 기울이는 이유이며 UI 스레드로 전환하여 업데이트를 게시하는 이유입니다. – Will

+0

많은 자원이 https://stuff.seans.com/2009/05/21/net-basics-do-work-in-background-thread-to-keep-gui-responsive/ 또는 유사한 검색 결과에 있습니다. – Will

+0

루프가 어디 있습니까? – TaW

답변

0

직렬 포트를 멤버 변수로 만든 다음 양식에 타이머를 추가하십시오. 그런 다음 직렬 데이터를 구문 분석하고 타이머 콜백 내에서 그래프에 데이터 요소를 추가 할 수 있습니다.