在命令调用之间等待串口响应
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)
但不知道静电计的响应时间到底有多可靠,这真的是最佳实践吗?难道不需要在每次发送命令后都调用它吗?
如果您需要的是:
- 发送命令
- 等待回复
- 发送下一条指令
然后你可以使用Semaphore
它的工作原理类似于下面的代码。
Semaphore _sync = new Semaphore(1, 1);
SerialPort _port;
...
void Send(...){
_sync.WaitOne()
_port.Send(...);
}
void _port_DataReceived(...){
_sync.Release();
}
试试吧!
我正在使用使用 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)
但不知道静电计的响应时间到底有多可靠,这真的是最佳实践吗?难道不需要在每次发送命令后都调用它吗?
如果您需要的是:
- 发送命令
- 等待回复
- 发送下一条指令
然后你可以使用Semaphore
它的工作原理类似于下面的代码。
Semaphore _sync = new Semaphore(1, 1);
SerialPort _port;
...
void Send(...){
_sync.WaitOne()
_port.Send(...);
}
void _port_DataReceived(...){
_sync.Release();
}
试试吧!