【发布时间】:2019-03-27 05:28:33
【问题描述】:
我正在尝试使用来自 FTDI 的 D3XX.NET 从 USB 端口收集数据。收集数据,然后将其发送到快速傅立叶变换以绘制光谱。即使您错过了一些数据,这也可以正常工作。你说不出来。但是,如果您想将此数据发送到音频输出组件,您会注意到数据丢失。这就是我的问题所在。 数据被收集,然后发送到音频设备。所有数据包都在所需的时间范围内完成。但是,音频正在丢弃它出现的数据。这是音频输出端正弦波的图片:
您可以看到开始时缺少一些数据,并且在接近尾声时似乎缺少整个周期。这只是一个例子,它一直在变化。有时似乎数据不存在。 我已经完成了整个处理链,我很确定声音的数据包正在制作它。 从那以后,我一直使用 JetBrains 性能分析器。我发现如下: ReadPipe 方法需要 8.5 毫秒,这正是您期望的读取时间。到目前为止,一切都很好。 ReadPipe 命令完成后,您有 0.5 毫秒的时间来执行另一个 ReadPipe,否则您将丢失一些数据。查看分析器输出,我看到了:
ReadPipe 需要 8.5 毫秒,然后有这个垃圾回收条目,平均需要 1.6 毫秒。如果这种情况确实偶尔发生,那么我已经丢失了一些数据。
所以这里是代码:它是一个后台工作者:
private void CollectData(object sender, DoWorkEventArgs e)
{
while (keepGoing)
{
ftStatus = d3xxDevice.ReadPipe(0x84, iqBuffer, 65536, ref bytesTransferred); //read IQ data - will get 1024 pairs - 2 bytes per value
_waitForData.Set();
}
}
等待句柄向其他线程表明数据可用。 那么GC是丢失数据的原因吗?如果是这样,我该如何避免这种情况? 谢谢!
【问题讨论】:
标签: c# garbage-collection usb real-time