如何更可靠地使用SerialPort类

本文关键字:SerialPort 何更可 | 更新日期: 2023-09-27 18:18:18

我已经在一个与我设计的一些外部硬件通信的应用程序中使用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事件本身有问题,所以……?这里的任何指导将是伟大的,并道歉,如果它是显而易见的!

如果我没有提到一些对任何试图回答这个问题的人有益的东西,那么请务必让我知道。提前感谢任何指导和/或反馈!

如何更可靠地使用SerialPort类

这是一个递归函数,因此在打开端口后只调用此代码一次,并且它将继续重复自己,而不会阻塞执行(或需要DataReceived事件处理程序)。