2012-07-24 69 views
2

我正在从事项目,我必须通过串行端口进行通信。我将通过RS232(大约6KB/10ms)从UART接收相当“大”的数据量,并且我必须收集并解码它。解码数据将被存储到文件,并且它们中的一些将是在GUI中示出的需要关于C++/CLI通过串口通信的建议

我将使用C++/CLI(在使用.NET V4.0 的Visual Studio 2010由于管理的数据的工作和大量的库。

而且我主要问题是:你会推荐我

A)当不使用线程,查找数据通过定时器每5毫秒...

B)不使用线程并根据传入数据的事件查找数据...

C)使用线程...

你会推荐我什么?我没有太多的经验来说明什么是最好的解决方案。

感谢您对未来应对......

+0

这取决于。程序的SOLE目的是否等待这些数据,直到它被CTRL-C杀死为止?如果是这样,那么串行端口上的“选择”可能是最可行的解决方案。如果您想以任何方式与该计划进行互动,恐怕线程将是您最好的选择。 – ATaylor 2012-07-24 08:02:03

+0

有几乎像正常文本一样大胆,有点击败目的.. – stijn 2012-07-24 08:02:13

+0

我试图高lite提供重要信息。但解决方案是线程。 Stijn是完全正确的。 – Scientist42 2012-07-24 09:29:00

回答

3

如果你需要一个GUI,你需要一个单独的线程来获取数据。没有办法可靠地获取每个xmSec的数据并在UI线程中处理它。

除此之外,您似乎对某个线程的操作感到困惑:A和B可以与C结合使用。我建议使用单独的线程轮询数据端口或使用事件来检查新数据何时到达。计时器可能不准确,毕竟它是端口规定数据传入的速率,所以最好听一下,而不是使用单独的时基。将处理后的数据存储在队列中(又名生产者),并有另一个线程(又名消费者)从队列中获取大块以将其刷新到文件(您不想每5mSec写一个文件,而是写一个文件大量的数据在每100mSec左右移动一次)。 然后,ui线程也可以从该队列中预览并显示数据片段。

+0

谢谢,我以为同样的事情,但我正在考虑不使用线程。 – Scientist42 2012-07-24 08:10:02

+0

Nah - 使用一个线程,一个生产者 - 消费者队列和一个'Buffer'类,你可以很容易地通过地址移动/排队,以保存复制数据。从线程中的COM端口加载一个*缓冲区,排队并立即为下一次加载的数据在同一个var中创建一个新的* Buffer。听起来像Buffer类中的10K缓冲区成员没问题。不要使用不可重新定位的C++引用或任何堆栈对象 - 使用new()和指针。 – 2012-07-24 09:36:41

+0

..并且在处理完* Buffers后,不要忘记删除()它们!有更快的机制使用*缓冲池,但我不认为你真的需要这种锤子的COM端口悲惨。如果你需要在你的GUI中显示一些数据,你必须将PostMessage()* Buffer实例加入到GUI中 - 相当简单 - 只需将它们转换为lParam(或者使用BeginInvoke或Dispatcher或者其他GUI通常你使用的通讯工具)。 – 2012-07-24 09:41:26