2012-01-11 49 views
1

我这有以下代码中(其中包括但只显示相关部分)一个串口通讯类:如何更改事件处理程序回调动态

public Form1 m_parent; 
private delegate void ProcessPacketDelegate(byte[] packet); 
public SerialPort comPort = new SerialPort(); 

//Constructor code 
....setting baudrate, portname etc. 
... setting m_parent as the main form 
...setting other things 

//add an event handler 
comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived); 
//constructor code end 

void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
     int bytes = comPort.BytesToRead; 
     byte[] comBuffer = new byte[bytes]; 
     comPort.Read(comBuffer, 0, bytes); 
     comPort.DiscardInBuffer(); 
     m_parent.Invoke(new ProcessPacketDelegate(m_parent.ProcessPacket), comBuffer); 
} 

我实例化这个类从我的主窗体中,哪个地址存储在m_parent中。主窗体有一个名为ProcessPacket的方法,用于处理传入数据包。到现在为止还挺好。

现在,我想处理2个串行端口,所以我需要这个类的2个实例。但是,我不希望他们使用可能导致数据包冲突的相同ProcessPacket方法。我想通过在构造函数或getset中动态设置回调方法来修改串口通信类,以便实例#1调用m_parentProcessPacket_A,实例#2调用m_parentProcessPacket_B。不幸的是,这似乎超出了我的.NET技能,所以任何帮助都会很棒! 谢谢!

+0

两个串口== 2个DataReceived事件。只需将通用代码移入私有助手方法即可。顺便说一句,*从不*在数据读取方法中调用DiscardInBuffer(),这只会导致不可读的数据丢失。 – 2012-01-11 14:40:10

+0

你的意思是DiscardInBuffer可以刷新缓冲区,而前面的代码行 - comPort.Read(...) - 尚未完成吗? – JustGreg 2012-01-11 19:37:36

+0

驱动程序在事件处理程序中运行异步。您将放弃Read调用后接收纳秒的字节。 – 2012-01-11 20:15:47

回答

1

您可以在构造函数中定义一个变量并使用它。

if(condition) 
    handler = comPort_DataReceived; 
else 
    handler = comPort_SomeElseMethod; 

,然后绑定这个

comPort.DataReceived += handler 
+0

谢谢!不是我正在寻找的东西,而是一个很好的解决方法。 – JustGreg 2012-01-11 10:43:37

0

有一个这样的构造:

YourClass(ProcessPacketDelegate process_packet) 
{ 
    // ... 
    this.process_packet = process_packet; 
} 

在你的类,也纷纷:

ProcessPacketDelegate process_packet; 
comPort_DataReceived

然后:

m_parent.Invoke(this.process_packet, comBuffer); 

在你当你的实例类主要形式做:

instance1 = new YourClass(new ProcessPacketDelegate(this.ProcessPacket_A)); 
instance2 = new YourClass(new ProcessPacketDelegate(this.ProcessPacket_B)); 
+0

非常感谢!我按照你的建议修改了我的类,但是仍然停留在主窗体中,因为在Intellisense下面的行中发现了一个错误:'字段初始值设定项不能引用非静态字段,方法...' instance1 = new YourClass(new ProcessPacketDelegate (ProcessPacket_A)); 试图把'公共代理无效ProcessPacketDelegate(byte []包);''在上面但是无济于事。 – JustGreg 2012-01-11 10:49:41

+0

我已经修复了示例代码。 – Krizz 2012-01-11 14:25:08

+0

非常感谢! – JustGreg 2012-01-11 19:35:58

相关问题