我有一个传感器通过串口给我力读数。我在串口输入一个命令,每次都会给我一个读数。我经常使用计时器发送命令。
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次阅读力量吗?
答案 0 :(得分:0)
请勿将该事件用于dataReceived。我从来没有像我想要的那样工作。
我只是发送命令,等待(无论在控制器上设置接收回复的延迟多长时间),然后从端口读取。
我通过执行Thread.Sleep(40)来做到这一点(例如在我的项目中,答案在40ms内回复)。然后阅读答案。即使端口上没有收到所有数据,dataReceived事件也会触发。在我决定使用DataReceived事件的地方,我无法想到我使用的任何串口应用程序。我只是写入端口然后在某种循环中侦听回复。
你可能还想在SerialPort类上使用.ReatTo(“....”),如果你知道答案将会回来,例如你的答案是否以[0.9997 ...]回来以那种格式,你会做
port.ReadTo("]");
这将阻塞线程,直到你在输入缓冲区中获得该字符。