【问题标题】:Serial Port Communication, Data Acquisiton, and ZedGraph - Too many Y coordinates for one X coordinate串行端口通信、数据采集和 ZedGraph - 一个 X 坐标的 Y 坐标太多
【发布时间】:2012-02-09 03:31:02
【问题描述】:

我有一个传感器,它通过串行端口向我提供力读数。我向串口输入一个命令,它每次都会给我 1 个读数。我使用计时器每隔一段时间发送一次命令。

private void daqTimerElapsed(object sender, ElapsedEventArgs e)
{


    giveCommand("W");


    timeCounter += timeBetweenSamples;



}

一旦命令被发送,串行端口的 dataReceived 事件就会触发,这就是强制读取以字符串形式出现的地方。我将字符串转换为双精度并将其放入双精度的 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 次强制阅读吗?

【问题讨论】:

  • 请不要在标题前加上“C# -”之类的前缀。这就是标签的用途。
  • @M.Babcock: 不错 - 及时让我编辑。

标签: c# zedgraph


【解决方案1】:

不要将事件用于 dataReceived。我也从来没有按照我想要的方式让它发挥作用。

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

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

您可能还想在 SerialPort 类上使用 .ReatTo("...."),如果您知道答案将返回,例如,如果您的答案返回 [0.9997...]以这种格式,你会这样做

port.ReadTo("]");

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

【讨论】:

  • 好的,谢谢,我会尝试不使用 dataReceived,是的 ReadTo() 很好,我只是读到一个换行符,然后修剪
  • 如果您认为这有助于解决问题,请选择它作为答案。
  • 好吧,我尝试了您的建议,基本上摆脱了 dataReceived 部分并将其移至计时器中。我写了命令,等待大约 50 毫秒,然后像你说的那样阅读。它有效,但仍然不能解决我的值表问题。我仍然会在 1 次阅读中获得大量的力读数。我只想要1对1! :(
猜你喜欢
  • 1970-01-01
  • 2015-05-23
  • 2011-10-01
  • 2017-04-25
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 2019-12-05
  • 2023-03-30
相关资源
最近更新 更多