SerialPort控制器的多线程安全使用

时间:2013-11-15 01:34:56

标签: c# multithreading serial-port doevents

我已经阅读过几篇关于c#和Application.DoEvents()中的线程的文章...仍然无法正确使用它来完成我的任务: 我有一个控制器连接到我的COM,这个控制器工作命令(我发送命令,需要等待几毫秒才能得到它的响应),假设响应是我想要使用循环绘制每个时间间隔的数据: / p>

  • 开始我的循环。
  • 通过serialPort向控制器发送命令。
    • 等待回应(等待20毫秒)。
    • 获取数据。
  • 重复这个循环,每说100毫秒。

这根本不想工作!!我试图与其他线程上的数据控制器进行通信,但似乎无法访问属于主线程的serialPort(粗略地说)。

感谢任何帮助

3 个答案:

答案 0 :(得分:2)

Application.DoEvents就是它所做的一切 - 只不过是对同一线程上的windows(低级)消息循环的嵌套调用。如果在事件处理程序中调用它,则可能很容易导致递归。您可以考虑在工作线程上创建串行端口对象,并通过线程类(即WaitHandles等)进行通信。或者使用UI对象上的“BeginInvoke”和“EndInvoke”回调您的UI线程。

答案 1 :(得分:0)

如果捕获SerialPort.DataReceived事件然后使用枯竭的SerialPort.ReadLine或SerialPort.Read(byte [],int,int),那么这些方法将在新线程上执行。我更喜欢使用互斥锁来控制对作为共享资源的字节缓冲区的访问。你有没有成功地与你的设备沟通?如果不是端口设置,请检查SerialPort.NewLine属性和SerialPort.Handshake属性。这些设置取决于您尝试与之通信的设备。

答案 2 :(得分:-1)

为什么开始使用它?

看看这个页面,它可能会给你一个方向

  1. 我的最爱:Is DoEvents Evil?
  2. 来自msdn blog Keeping your UI Responsive and the Dangers of Application.DoEvents
  3. 来自msdn forums Application does not return from call to DoEvents
  4. 没有代码,就很难提供帮助。即使使用代码,也可能很难提供帮助:)

    我同意gunr2171:)