【问题标题】:Waiting for Serial Port response between command calls等待命令调用之间的串行端口响应
【发布时间】:2015-11-18 15:16:25
【问题描述】:

我正在使用使用 RS-232(串行)通信的静电计。它一次接受一个命令,并返回一个响应,指示该命令是否成功完成。

为了演示,只考虑以下方法...

    private void SetDevice()
    {
        sc.SetBias();
        sc.SetRange();
        sc.SetCollectionTime();
        sc.SetID();
    }

sc.SetID() 的方法签名如下。

    public void SetID()
    {
        ComPort.Write("*IDN?");
    }

以上内容让您了解其他单独的命令调用是什么样的。

由于DataReceived Event 表明它是在辅助线程上引发的,我应该如何继续等待每个命令调用之间的响应?目前在sc.SetBias() 被称为sc.SetRange() 之后触发,而不考虑上一个命令是否成功执行。

我可以理解,通过在新线程中启动 DataReceivedEvent 可以防止我的 UI 锁定,但在这种情况下,当响应与适当的命令调用配对至关重要时,我不确定最好的可用选项,并希望在我的研究中得到一些指导。到目前为止,我正在考虑获取当前 UI 线程的句柄并使用Thread.Sleep(sleepTime),但不知道静电计的响应时间到底有多可靠,这真的是最佳实践吗?并且不需要在发送每个命令后调用它吗?

【问题讨论】:

  • 为什么不在第二个线程上排队?制作一个通用接口,您可以将呼叫推送到队列中。然后,队列管理器可以负责确保不会同时发生两个调用。抱歉,我不熟悉静电计。我强烈建议不要使用 thread.sleep,如果这是在任何类型的负载下,您将花费更多时间进行上下文切换而不是实际计算。
  • 不要使用DataReceived,它对你一点帮助都没有。只需在调用 Write() 后直接读取响应,通常使用 ReadLine()。您需要 ReadTimeout 属性以避免挂起。

标签: c# multithreading serial-port thread-safety threadpool


【解决方案1】:

如果你需要的是:

  1. 发送命令
  2. 等待回复
  3. 发送下一条命令

然后你可以使用Semaphore

它的工作原理类似于以下代码。

Semaphore _sync = new Semaphore(1, 1);
SerialPort _port;
...

void Send(...){
    _sync.WaitOne()
    _port.Send(...);
}

void _port_DataReceived(...){
    _sync.Release();
}

试试看!

【讨论】:

  • Thread.Join()的使用呢?我正在审查following 认为如果DataRecieved 事件在一个新线程上被触发,但加入了当前线程暂停主线程的操作,直到它完成此操作才能达到我的目的?
  • 我尝试了你的建议,也许我不理解 API。它声明“限制可以同时访问资源或资源池的线程数。”在上面的示例中,将使用 _sync.WaitOne() 然后锁定发送方法直到它被释放?如果是这种情况,因为您示例中的 Send(...) 方法已经触发,我不需要锁定它。需要锁定的是它后面的方法。
  • 我需要告诉主线程停止做事,直到你收到回复。这个MSDN 列表讨论中断线程? @Jaime Babineau,我喜欢这个想法,但我是开发新手,完全知道如何开始实施这个.......将继续努力寻找解决方案以供审查。谢谢你的建议。
  • Join() 不适合您的情况(在我看来)。当 A 想等待 B 完成时,A 加入 B,但是,A 必须知道“谁是 B”才能加入。当然,这是 DataReceived 的一个新线程,但是当您调用 Send 时,您永远不知道该线程是谁。
  • @TargetofGravity 在我的示例中,运行顺序是:锁定 -> 发送 -> 接收 -> 释放 -> 锁定 -> 发送 -> 接收 -> 释放,这正是您所需要的,对吧?发送后不能锁定,因为顺序是:发送 -> 锁定或接收,如果接收快于锁定,则同步中断,您将收到信号量异常。你可以尝试自己移动Lock的位置,看看会发生什么。
猜你喜欢
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多