串行端口通信,数据采集和ZedGraph - 一个X坐标的Y坐标太多

时间:2012-02-08 19:22:11

标签: c# zedgraph

我有一个传感器通过串口给我力读数。我在串口输入一个命令,每次都会给我一个读数。我经常使用计时器发送命令。

private void daqTimerElapsed(object sender, ElapsedEventArgs e)
{


    giveCommand("W");


    timeCounter += timeBetweenSamples;



}

一旦命令被发送,串口的dataReceived事件就会触发,而强力读数就是字符串。我将字符串转换为double并将其放入List<>双打。基本上我正在尝试设置值表,以便我可以在ZedGraph中执行实时图形。每次有新数据到达时,将其存储在数组列表中,然后更新图形。

//graphing section from DataReceived event
if (graphFlag == 1)
{
    dataReading = Convert.ToDouble(data);


    x.Add(timeCounter / 1000);
    y.Add(dataReading);


    //remake the graph each time a new X Y pair arrives
    zedGraphControl1.GraphPane.CurveList.Clear();

    spl1 = new PointPairList(x.ToArray(), y.ToArray());



    GraphPane myPane = zedGraphControl1.GraphPane;
    myCurve1 = myPane.AddCurve(curveTitle, spl1, Color.Orange, SymbolType.None);


    zedGraphControl1.AxisChange();

    zedGraphControl1.Invalidate();

    zedGraphControl1.Invoke(new EventHandler(delegate { zedGraphControl1.Refresh(); }));



    numSamples++; }

我得到了它的工作,除了每次阅读,有很多力读数,但我只想读取每次读力1次。我导出到文件方法显示了这个(时间然后强制):

//export the data to a text file
    private void exportToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Stream myStream;
        SaveFileDialog saveFileDialog1 = new SaveFileDialog();
        saveFileDialog1.Title = "Save the test results to a text file";
        saveFileDialog1.ShowDialog();

        if ((myStream = saveFileDialog1.OpenFile()) != null)
        {
            StreamWriter st = new StreamWriter(myStream);

            foreach(double xvalue in x)
            {
                foreach(double yvalue in y)
                {

                    st.WriteLine(xvalue.ToString() + "   " + yvalue.ToString());

                }

            }

            myStream.Close();
        }

    }

0 -8.11182 0 -7.953495 0 -7.953495 0 -7.939525 0 -7.939525 0 -7.948838 0 -7.981434 0 -7.981434 0 -7.865019 0 -7.865019 0 -7.883646 0 -7.883646 0-8.041971 0-8.037314 0-8.037314 0 -7.841736 0 -7.841736 0.1 -7.874332 0.1 -7.986091 0.1 -7.986091 0.1 -7.934868 0.1 -7.832423 0.1 -7.832423 0.1 -7.832423 0.1 -7.902272 0.1 -7.902272 0.1 -8.023344 0.1 -7.897616 0.1 -7.897616 0.1 -7.869676 0.1 -7.869676

任何人都可以帮助我获得1次阅读力量吗?

1 个答案:

答案 0 :(得分:0)

请勿将该事件用于dataReceived。我从来没有像我想要的那样工作。

我只是发送命令,等待(无论在控制器上设置接收回复的延迟多长时间),然后从端口读取。

我通过执行Thread.Sleep(40)来做到这一点(例如在我的项目中,答案在40ms内回复)。然后阅读答案。即使端口上没有收到所有数据,dataReceived事件也会触发。在我决定使用DataReceived事件的地方,我无法想到我使用的任何串口应用程序。我只是写入端口然后在某种循环中侦听回复。

你可能还想在SerialPort类上使用.ReatTo(“....”),如果你知道答案将会回来,例如你的答案是否以[0.9997 ...]回来以那种格式,你会做

port.ReadTo("]");

这将阻塞线程,直到你在输入缓冲区中获得该字符。