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