2012-01-11 76 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

相關問題