C# 串口通信、数据采集和ZedGraph-一个X坐标的Y坐标太多

C# 串口通信、数据采集和ZedGraph-一个X坐标的Y坐标太多,c#,zedgraph,C#,Zedgraph,我有一个传感器,它通过串口给我测力读数。我键入一个命令到串行端口,它会给我回1读每一次。我经常使用计时器发送命令 private void daqTimerElapsed(object sender, ElapsedEventArgs e) { giveCommand("W"); timeCounter += timeBetweenSamples; } 一旦命令被发送,串口的dataReceived事件就会触发,这就是强制读取作为字符串输入的地方。我将字符串转换为

我有一个传感器,它通过串口给我测力读数。我键入一个命令到串行端口,它会给我回1读每一次。我经常使用计时器发送命令

private void daqTimerElapsed(object sender, ElapsedEventArgs e)
{


    giveCommand("W");


    timeCounter += timeBetweenSamples;



}
一旦命令被发送,串口的dataReceived事件就会触发,这就是强制读取作为字符串输入的地方。我将字符串转换为double并将其放入double列表中。基本上,我正在尝试设置值表,以便在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++; }
我得到了它的工作,除了每次阅读,有很多力的读数,但我只希望每次阅读一个力的读数。我的导出到文件方法显示以下内容(时间然后强制):

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


有人能帮我一次读取一个强制读数吗?

不要将事件用于接收的数据。我也从来没有让它按照我想要的方式工作过

我只需发送命令,等待(无论控制器上设置的接收应答延迟有多长),然后从端口读取

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

您可能还希望在SerialPort类上使用.ReatTo(“..”),如果您知道答案将以什么形式返回,例如,如果您的答案以该格式返回[0.9997…],您可以这样做

port.ReadTo("]");

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

请不要在标题前加上“C#-”之类的前缀。这就是标签的作用。@M.Babcock:我编辑的及时性很好。好的,谢谢,我会尝试不使用dataReceived,是的ReadTo()很好,我只是读到一行新词,然后修剪如果你认为这有助于解决问题,选择它作为答案。我尝试了你的建议,基本上去掉了dataReceived部分,将其移到计时器中。我写下命令,等待大约50毫秒,然后像你说的那样阅读。它是有效的,但仍然不能解决我的价值表问题。我仍然得到了大量的力读数。我只想要一对一!:(
port.ReadTo("]");