我正在做一个项目,该项目需要我从连接到编码器(带有 QSB 的美国数字 S5 光轴编码器)的串行端口读取的每个数据条目的精确时间(毫秒)。
我将编码器安装在一辆小推车上,用它来计算推车的速度。
这是我到目前为止所做的:
连接到串行端口并将命令写入 QSB 以告诉编码器流数据。此处可用的命令:
www.usdigital.com/assets/general/QSB%20Commands%20List_1.pdf www.usdigital.com/assets/general/QSB%20Applications%20Examples.pdf
使用 readline() 读取接收到的数据。
- 将所有数据行放入一个 StringBuilder 并将其输出到文件中。
当我将输出值阈值和间隔速率设置为尽可能快时,我能够在 1ms 之间获取数据条目。这是我得到的:
----time stamp(h/m/s/ms)-------value
具有正确时间戳的数据:https ://www.dropbox.com/s/pvo1dz56my4o99y/Capture1.JPG
但是,有突然的“跳跃”,当数据连续时大约 200 毫秒(我正在匀速滚动购物车)
时间戳不正确的数据:https ://www.dropbox.com/s/sz3sxwv4qwsb2cn/Capture2.JPG
这是我的代码:
private void buttonOpenEncoderPort_Click(object sender, EventArgs e)
{
serialPortEncoder.Write("S0E\r\n");//start streaming data
System.Threading.Thread.Sleep(500);
serialPortEncoder.Write("W0B0\r\n");//set threshold to 0 so the encoder will stream data a the interval I set.
System.Threading.Thread.Sleep(500);
serialPortEncoder.Write("W0C0000\r\n");//set output interval to 0 so it will stream as fast as possible
System.Threading.Thread.Sleep(1500);
backgroundWorkerEncoder.RunWorkerAsync();}
//I am using a background worker to pull data out.
private void backgroundWorkerEncoder_DoWork(object sender, DoWorkEventArgs e)
{
while (serialPortEncoder.IsOpen)
{
if (serialPortEncoder.BytesToRead != 0)
{
try
{
String s = serialPortEncoder.ReadLine();//read from encoder
LazerBucket.Add(getCurrentTimeWithMS(timeEncoder) + "-----" + s + "\r\n");//put one line of data with time stamp in a List<String>
richTextBoxEncoderData.BeginInvoke(new MethodInvoker(delegate()
{
richTextBoxEncoderData.Text = s; })); //update UI
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
}
}
}
private String getCurrentTimeWithMS(DateTime d)//to get time
{
StringBuilder s = new StringBuilder();
d = DateTime.Now;
int hour = d.Hour;
int minute = d.Minute;
int second = d.Second;
int ms = d.Millisecond;
s.Append(" ----" + hour.ToString() + ":" + minute.ToString() + ":" + second.ToString() + ":" + ms.ToString());
return s.ToString();
}
如果有人能找到时间跳跃的原因,我会很高兴。200ms 太多了,不容忽视。
EDIT:
正如建议的那样,我试过了,Stopwatch
但仍然有 200 毫秒的延迟。但是当我一起打印时间戳和 BytesToRead 时,我发现缓冲区中的数据随着 readLine() 的执行而减少。最终 BytesToRead 将下降到个位数,这就是延迟发生的地方。我正在寻找有关如何实现线程的更好解决方案。以及延迟的解释。也许我读得很快,所以缓冲区跟不上我?
EDIT:
问题解决了。请参阅下面的答案。不过感谢您的回复。秒表真的很有帮助。现在我正在尝试确定事件驱动或轮询是否更好。