在命令调用之间等待串口响应

Waiting for Serial Port response between command calls

我正在使用使用 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) 但不知道静电计的响应时间到底有多可靠,这真的是最佳实践吗?难道不需要在每次发送命令后都调用它吗?

如果您需要的是:

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

然后你可以使用Semaphore

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

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

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

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

试试吧!