在做串口通信的时候,往往会 发送一条命令给设备,然后等待接收,由于串口有DataReceive这个事件,使用异步通信非常方便,但是,往往我们只需要发送一条命令,然后等待回复(Sp.DataReceive +=sp_DataReceive),但是,这样子,要是这条命令发送没成功,重复发送,就会导致(Sp.DataReceive +=sp_DataReceive)多次,从而导致sp_DataReceive执行次数过多,如果命令是多样的,回复也是多样的,例如(针对CMD1,有Sp.DataRcieve +=sp_DataReceive_For_CMD1,针对CMD2,有Sp.DataRcieve +=sp_DataReceive_For_CMD2)。
现在想到能解决的办法,就是分别对sp_DataReceive_For_CMD1订阅的次数,sp_DataReceive_For_CMD2订阅的次数使用一个变量来标记,然后,如果有CMD3,Sp.DataRcieve +=sp_DataReceive_For_CMD3,那么执行之前就使用循环,多次执行Sp.DataRcieve -=sp_DataReceive_For_CMD1,或者Sp.DataRcieve -=sp_DataReceive_For_CMD2,直到订阅次数清空。
问题来了,有没有更加完美的解决办法?
------解决思路----------------------
Sp.DataReceive +=sp_DataReceive写进load里只注册一次不就好了
除非你确定只发送一次,接收一次,这个对象就要dispose掉了
否则如果你需要多次反复发送接收,弄个全局Sp不好吗
------解决思路----------------------
就像1楼说的,这样只监听一次不就好了
class A
{
SerialDataReceivedEventHandler _dataReceivedDelegate;
public A(SerialPort serialPort)
{
serialPort.DataReceived += this.OnDataReceive;
}
void OnDataReceive(object sender, SerialDataReceivedEventArgs e)
{
if (this._dataReceivedDelegate != null)
this._dataReceivedDelegate(sender, e);
}
public void SetListener(SerialDataReceivedEventHandler listener)
{
this._dataReceivedDelegate = listener;
}
}