2017-03-08 96 views
0

我想繪製使用zedgraph從串行端口讀取的數據。我仍然在學習代碼,所以我不能推斷爲什麼情節不起作用。請查看代碼和建議;使用zedgraph繪製串行端口數據(數據VS時間)

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(new Action(()=> Control.Update(w)));當試圖更新圖表,以便我可以保存之後。

我再次出現以下錯誤:DrawPoint(zed1,point); 謝謝大家的時間。美好的一天。

乾杯, Ram。

回答

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

我現在不能。之前我有一個richtextbox而不是zedgraph,我能夠從com端口讀取數據。但現在我開始嘗試用zedgraph替換richtextbox,這很複雜。我試圖更好地理解並完成這件事,但幾天後我可能會轉向圖表。讓我再次瞭解你的建議。美好的一天。 –