我一直在使用SerialPort
在与我设计的一些外部硬件通信的应用程序中学习一段时间。在上述硬件的调试过程中,我发现了一些不可靠的地方,最近我偶然发现this http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport这似乎是有道理的。
我正在尝试将其实现到我的应用程序中,但是我有两个关于接收数据的问题......
因此,在我链接的文章中,作者提到DataReceived
事件是有问题的,并显示了如何使用它的典型代码示例......
port.DataReceived += port_DataReceived;
// (later, in DataReceived event)
try {
byte [] buffer = new byte[port.BytesToRead];
port.Read(buffer, 0, buffer.Length);
raiseAppSerialDataEvent(buffer);
}
catch (IOException exc) {
handleAppSerialError(exc);
}
然后展示了作者认为正确的方法......
byte[] buffer = new byte[blockLimit];
Action kickoffRead = null;
kickoffRead = delegate {
port.BaseStream.BeginRead(buffer, 0, buffer.Length,
delegate (IAsyncResult ar) {
try {
int actualLength = port.BaseStream.EndRead(ar);
byte[] received = new byte[actualLength];
Buffer.BlockCopy(buffer, 0, received, 0, actualLength);
raiseAppSerialDataEvent(received);
}
catch (IOException exc) {
handleAppSerialError(exc);
}
kickoffRead();
}, null);
};
kickoffRead();
我的问题围绕着使用BaseStream.BeginRead
;在我的班级中,应该将读取数据的内容放在哪里?我的第一个想法是DataReceived
事件,如第一个示例所示,展示如何不使用SerialPort
类作者提到代码位于DataReceived
评论中的事件,但是对于显示更好方法的示例,作者没有提及代码应该在哪里,所以我认为他仍然指的是DataReceived
事件,但随后作者提到DataReceived
事件本身就有问题,所以……?这里的任何指导都会很棒,如果很明显的话,我们深表歉意!
如果我没有提到任何对试图回答这个问题的人有益的事情,那么请务必让我知道。
预先感谢您的任何指导和/或反馈!