我這有以下代碼中(其中包括但只顯示相關部分)一個串口通訊類:如何更改事件處理程序回調動態
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技能,所以任何幫助都會很棒! 謝謝!
兩個串口== 2個DataReceived事件。只需將通用代碼移入私有助手方法即可。順便說一句,*從不*在數據讀取方法中調用DiscardInBuffer(),這隻會導致不可讀的數據丟失。 – 2012-01-11 14:40:10
你的意思是DiscardInBuffer可以刷新緩衝區,而前面的代碼行 - comPort.Read(...) - 尚未完成嗎? – JustGreg 2012-01-11 19:37:36
驅動程序在事件處理程序中運行異步。您將放棄Read調用後接收納秒的字節。 – 2012-01-11 20:15:47