使用zedgraph绘制串口数据(数据Vs时间)

时间:2017-03-08 12:39:14

标签: c# user-interface serial-port 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(new Action(()=> Control.Update(w)));在尝试更新图表时,我可以在此之后保存。

我再次遇到错误:DrawPoint(zed1,point); 谢谢大家的时间。美好的一天。

干杯, 拉姆。

1 个答案:

答案 0 :(得分: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();