0

我正在编写一个需要与串口通信的程序。我主要关心的是防止冲突并确保不会同时从不同的功能写入/读取。

首先,有一个系统定时器从头开始,用于定期向串口写入数据,并通过给定的超时值监听响应。因此,它将有一个 Elapsed Event 并完成工作。

其次,还有另一个功能具有更高的优先级,需要立即将数据写入串行端口。

场景 1. Elapsed 事件每 1 分钟触发一次,如果仍然挂起前一个事件或 SendImmediately 函数,则永远不会继续。

场景 2. 如果 SendImmediately 被调用,则需要等待当前正在运行的 OnTimedEvent 完成。同样, OnTimedEvent 的下一次运行将停止,直到 SendImmediately 完成。

问题。如何在上一个或 SendImmediately 完成之前阻止 OnTimedEvent 的下一次运行?基本上是为了防止它们之间的干扰。

我在这里进行了一些问答。有很多建议的答案,如下所示:

  • 禁用和启用计时器
  • AutoResetEvent(2 路信号)
  • 手动复位事件
  • Monitor.Enter / Monitor.Exit(锁定)
  • 队列
  • 睡眠/加入/Task.Wait(阻塞)

我没有坚实的基础来确定哪种方法对我来说是正确或合适的,因为每种方法都有不同的场景。非常感谢任何建议。

    public System.Timers.Timer aTimer = new System.Timers.Timer(Properties.Settings.Default.Interval * 60 * 1000);
    public bool InitialTimer(int interval, bool action)
    {
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        aTimer.Interval = interval;
        aTimer.Enabled = action; 
        GC.KeepAlive(aTimer);
        return action;
    }

    public void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        // write something to serial port
    }
    public void WriteImmediately()
    {
        // write something to serial port
    }
4

1 回答 1

0

我会通过让一个“SerialComms”线程在生产者-消费者队列上等待超时来做到这一点。如果队列等待超时,SerialComms 执行轮询定时操作,然后返回队列等待。如果更高优先级的线程想要向端口写入一些内容,它可以将其消息排队,因此导致 SerialComms 队列等待“立即”返回而没有超时,然后“SerialComms”代码可以执行缓冲区的写入。

The high-priority writes are signaled onto the SerialComms thread 'immediately'.
No explicit timer required.
No possibility of the high-priority write interrupting an ongoing timed operation.
No possibility of multiple timed operations stacking up or interrupting each other.
Multiple high-priority writes can be queued up without any interference.
于 2013-08-29T12:49:28.073 回答