2017-03-08 8 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ポートからデータを読み取ることができました。しかし、私はrichtextboxをzedgraphに置き換えることをやめ始めました。それは複雑です。私はもっ​​と理解してこれをやろうとしていますが、2,3日後にはおそらくチャートに目を向けるでしょう。あなたのアドバイスをもう一度教えてください。良い一日。 –

関連する問題