繁体   English   中英

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

[英]Plotting serial port data using zedgraph (data Vs time)

我正在尝试绘制使用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); 谢谢大家的时间。 美好的一天。

干杯,拉姆

要更新图表,您需要调用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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM