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