2017-03-08 6 views
0

zedgraph를 사용하여 직렬 포트에서 읽은 데이터를 플로팅하려고합니다. 나는 여전히 코드에 관심이있어, 왜 그 음모가 작동하지 않는지 추론 할 수 없다. 코드와 조언을 살펴보십시오.zedgraph (데이터 대 시간)를 사용하여 직렬 포트 데이터 플로팅

namespace WindowsApplication2 
{ 
    public partial class Form1 : Form 
    { 
     string t; 
     SerialPort sp; 

Thread m_thread; 
bool m_running = false; 
ManualResetEvent m_event = new ManualResetEvent(true); 
bool m_pause = false; 
private GraphPane myPane; 

public Form1() 
{ 
    InitializeComponent(); 
    Control.CheckForIllegalCrossThreadCalls = false; 
    // User can already search for ports when the constructor of the FORM1 is calling 
    // And let the user search ports again with a click 
    // Searching for ports function 

    SearchPorts(); 

    CreateZedGraph(); //error : Severity Code Description Project File Line Suppression State 
         //Error CS7036 There is no argument given that corresponds to the required formal parameter 
         //'w' of 'Form1.DrawPoint(ZedGraphControl, int, PointPair)' 
} 
// start button 
private void btnStart_Click(object sender, EventArgs e) 
{ 
    if (m_thread == null || m_thread.IsAlive == false) 
    { 
     ClearGraph(); 
     m_thread = new Thread(Process); 
     m_thread.Start(); 
    } 
} 
void Process() 
{  
    PointPair point = new PointPair(); 
    btnStart.Enabled = false; 
    btnStop.Enabled = true; 
    m_running = true; 
    while (m_running == true) 
    { 
     m_event.WaitOne(); 

     point.Y = Convert.ToDouble(serialPort1); 
     point.X++; //time instance of measurement?? 
     DrawPoint(zed1, point); 
     ssData.Value = point.Y.ToString(); 
     RefresheZedGraphs(zed1); 
     Thread.Sleep(700); 
    } 
    btnStart.Enabled = true; 
} 

private void CreateZedGraph(object sender, SerialDataReceivedEventArgs e, ZedGraphControl zgc) 
{ 
    myPane = zgc.GraphPane; 
    // axes stuff 
    myPane.Title.Text = "FRDM-KW40z serial Test"; 
    myPane.XAxis.Title.Text = "Time"; 
    myPane.YAxis.Title.Text = "Voltage"; 
    myPane.XAxis.MajorGrid.IsVisible = true; 
    myPane.YAxis.MajorGrid.IsVisible = true; 
    myPane.XAxis.MinorGrid.IsVisible = true; 
    myPane.YAxis.MinorGrid.IsVisible = true; 

    // data from serial port 

    PointPairList list = new PointPairList(); 
    zed1.GraphPane.AddCurve("Test", list, Color.Red); 

} 

열고 직렬 포트에서 읽기 위해, 나는 combox 버튼의 몇 가지를 사용하는 (그리고 나중에 내가 텍스트 파일로 저장하려고);

private void button2_Click(object sender, EventArgs e) 
    { 
     comboBox1.Items.Clear(); 
     SearchPorts(); 
    } 
    void SearchPorts() 
    { 
     string[] ports = SerialPort.GetPortNames(); 
     foreach (string port in ports) 
     { 
      comboBox1.Items.Add(port); 
     } 
    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     // Catch exception if it will be thrown so the user will see it in a message box 
     OpenCloseSerial(); 
    }  
    void OpenCloseSerial() 
    { 
     try 
     { 
      if (sp == null || sp.IsOpen == false) 
      { 
       t = comboBox1.Text.ToString(); 
       sErial(t); 
       button3.Text = "Close Serial port"; // button text 
      } 
      else 
      { 
       sp.Close(); 
       button3.Text = "Connect and wait for inputs"; // button text 

      } 
     } 
     catch (Exception err) // catching error message 
     { 
      MessageBox.Show(err.Message); // displaying error message 
     }   
    } 

    void sErial(string Port_name) 
    { 
     try 
     { 
      sp = new SerialPort(Port_name, 115200, Parity.None, 8, StopBits.One); // serial port parameters 
      sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 
      sp.Open(); 
     } 
     catch (Exception err) 
     { 
      throw (new SystemException(err.Message)); 
     } 
    } 
private void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e) 
    { 

     // This below line is not need , sp is global (belongs to the class!!) 
     //SerialPort sp = (SerialPort)sender; 
     if (e.EventType == SerialData.Chars) 
     { 
      if (sp.IsOpen) 
      { 
       string w = sp.ReadExisting(); 
       if (w != String.Empty) 
       { 
        Invoke(new Action(() => Control.Update(w))); 
       } 
      } 
     } 
    } 

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (sp == null || sp.IsOpen == false) 
     { 
      OpenCloseSerial(); 
     } 
    } 

플롯이 업데이트되지 않습니다! 나는 왜 그런지 추측 할 수 없다. 제 접근법이나 코드에 실수가 있으면 알려주세요. 다음에서 오류가 발생합니다. Invoke (새 Action (() => Control.Update (w))); 그 후에 그래프를 업데이트 할 수있게하려고 할 때.

다시 오류가 있습니다. DrawPoint (zed1, point); 감사합니다. 좋은 날.

건배, 램.

답변

0

차트를 업데이트하려면 Invalidate 메서드를 호출해야합니다.

직렬 포트에서 데이터를 수신하면이를 double[]으로 변환하고 해당 점을 PointPairList에 추가해야합니다.

PointPairList list = new PointPairList(); 
zed1.GraphPane.AddCurve("Test", list, Color.Red); 

//Convert the received data to double array 
double[] serialPortData = .... 

//You may want to clear list first, by list.Clear(); 
list.Add(serialPortData); 

//Invalidate the ZedGraphControl to update 
zed1.Invalidate(); 
+0

답장을 보내 주셔서 감사합니다. 나는 완전히 이해할 수 없다. 설명해 주시겠습니까? 아니면 나를 도울 수있는 모범이 있습니까? 좋은 날. –

+0

@ Ram.V 이해할 수없는 부분은 무엇입니까? 'serialPortData'를 얻을 수 있었습니까? – HebeleHododo

+0

나는 지금 그럴 수 없었다. 이전에는 zedgraph가 아닌 richtextbox가 있었고 com 포트에서 데이터를 읽을 수있었습니다. 하지만 이제 zipgraph로 richtextbox를 대체하기 시작했습니다. 그것은 복잡합니다. 나는 더 잘 이해하려고 노력하고있다. 그러나 며칠 후에 나는 아마도 차트로 돌아설 것이다. 너의 충고를 다시 알려줘. 좋은 날. –