包含SerialPort的多个对象具有相同的SerialDataReceivedEventHandler

本文关键字:SerialDataReceivedEventHandler 对象 SerialPort 包含 | 更新日期: 2023-09-27 17:54:53

我有两个对象(属于同一类),每个对象都包含一个SerialPort对象。该类有一个处理SerialPort.DataReceived事件的方法,并由两个SerialPort对象使用。

当我在单独的应用程序中实例化每个对象时,每个端口按预期单独处理其DataReceived事件。

当我在同一个应用程序中实例化COM_Front_End类的两个实例并将数据从一个串行端口发送到另一个串行端口时,两个端口的DataReceived事件处理程序都会触发。简而言之,我称之为"相声"。

我的类结构看起来像这样:

public class COM_Front_End
{
    private SerialPort_custom port;
    private LockObject;
    public COM_Front_End(string PortName, string BaudRate)
    {
        // Other code
        port = new SerialPort_custom(PortName, BaudRate, new SerialDataReceivedEventHandler(SerialDataReceived));
        port.Open();
    }
    private void SerialDataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        //lock (LockObject)  // A lock is not needed here. Only one SerialDataReceived event can fire at a time
        //{
            SerialPort port;
            try
            {
                port = sender as SerialPort;
                if (port != null)
                {
                    byte[] buffer = new byte[port.BytesToRead];
                    int bytesRead = port.Read(buffer, 0, buffer.Length);
                    foreach (byte inByte in buffer)
                    {
                        // Byte processing code
                    }
                }
            }
            catch (Exception ex)
            {
                // Exception handling code
            }
        //}
    }
}

包含实际SerialPort类的类如下:

public class SerialPort_custom : SerialPort
{
    public SerialPort_custom(string PortName, int BaudRate, SerialDataReceivedEventHandler DataReceivedHandler)
    {
        this.PortName = PortName;
        this.BaudRate = BaudRate;
        this.Parity = System.IO.Ports.Parity.None;
        this.DataBits = 8;
        this.StopBits = System.IO.Ports.StopBits.One;
        this.Handshake = System.IO.Ports.Handshake.None;
        this.RtsEnable = true;
        this.DtrEnable = true;
        this.DiscardNull = false;
        this.Encoding = Encoding.ASCII;
        this.DataReceived += DataReceivedHandler;
    }
    // Other methods
}

我在同一个应用程序中有两个COM_Front_End类实例。当一个实例接收到数据时,两个对象的SerialDataReceived方法都会被触发。

为什么DataReceived事件处理程序在同一个应用程序中实例化时为两个串行端口触发?此外,如何确保该类的多个实例化不会导致"串扰"?

包含SerialPort的多个对象具有相同的SerialDataReceivedEventHandler

我找到了问题的根源:

COM_Front_End所在的项目有两个静态类。其中一个类是接收缓冲区(Receive Buffer),另一个是发送缓冲区(Transmit Buffer)。更改这些类,使它们不是静态的,解决了我的问题。在每个COM_Front_End对象中都有一个轮询接收缓冲区的任务。因为它们都使用相同的静态类,它们都是从这个缓冲区提取的,这就解释了为什么

。两个对象的SerialDataReceived

B。收到的数据都是不完整的。

TL;DR:包含静态对象的非静态对象将产生共享资源,无论是否有意。

如果我的解释有错误或不完整的地方,请纠正我。

相关文章:
  • 没有找到相关文章