【问题标题】:Serial Port Data Received Event not working at second Port串行端口数据接收事件在第二个端口不起作用
【发布时间】:2019-07-22 07:38:13
【问题描述】:

我正在尝试通过自动创建一个串行端口对象并为其分配一个事件来侦听多个串行端口。映射函数用TestMachine检查接收到的数据是否正确并返回true/false。但是,当我尝试将代码放入 for 或 if 循环时出现问题,第一个串行端口接收到正确的数据(映射函数返回 true),然后第二个端口未接收到数据,这仅在收到 2 个端口中的一个时发生正确的结果(映射函数返回true)。

下面的代码没有 If(true)。

            SerialPort _serialPortA = new SerialPort(portA.ToString());
            _serialPortA.BaudRate = machineA.BaudRate;
            _serialPortA.Parity = machineA.Parity;
            _serialPortA.StopBits = machineA.StopBits;
            _serialPortA.DataBits = machineA.DataBits;
            _serialPortA.Handshake = machineA.Handshake;
            _serialPortA.DataReceived += new SerialDataReceivedEventHandler((sender2, e2) => DataReceivedHandler(sender2, e2, machineA));
            try
            {
                if (!_serialPortA.IsOpen)
                {
                    _serialPortA.Open();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

            SerialPort _serialPortB = new SerialPort(portB.ToString());
            _serialPortB.BaudRate = machineB.BaudRate;
            _serialPortB.Parity = machineB.Parity;
            _serialPortB.StopBits = machineB.StopBits;
            _serialPortB.DataBits = machineB.DataBits;
            _serialPortB.Handshake = machineB.Handshake;
            _serialPortB.DataReceived += new SerialDataReceivedEventHandler((sender3, e3) => DataReceivedHandler(sender3, e3, machineB));
            try
            {
                if (!_serialPortB.IsOpen)
                {
                    _serialPortB.Open();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

下面的代码不起作用。不同之处只是将代码放入 if(true){...} 块中。

       if (true) {
                SerialPort _serialPortA = new SerialPort(portA.ToString());
                _serialPortA.BaudRate = machineA.BaudRate;
                _serialPortA.Parity = machineA.Parity;
                _serialPortA.StopBits = machineA.StopBits;
                _serialPortA.DataBits = machineA.DataBits;
                _serialPortA.Handshake = machineA.Handshake;
                _serialPortA.DataReceived += new SerialDataReceivedEventHandler((sender2, e2) => DataReceivedHandler(sender2, e2, machineA));
                try
                {
                    if (!_serialPortA.IsOpen)
                    {
                        _serialPortA.Open();
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
        }

        if (true) {
                SerialPort _serialPortB = new SerialPort(portB.ToString());
                _serialPortB.BaudRate = machineB.BaudRate;
                _serialPortB.Parity = machineB.Parity;
                _serialPortB.StopBits = machineB.StopBits;
                _serialPortB.DataBits = machineB.DataBits;
                _serialPortB.Handshake = machineB.Handshake;
                _serialPort10.DataReceived += new SerialDataReceivedEventHandler((sender3, e3) => DataReceivedHandler(sender3, e3, machineB));
                try
                {
                    if (!_serialPortB.IsOpen)
                    {
                        _serialPortB.Open();
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
        }

这是 DataReceivedHandler 函数

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e, AnalysisMachine m)
        {
            //Thread.Sleep(100);
            string res = ((SerialPort)sender).ReadExisting();

            res = res.Replace("\r", "");
            try
            {

                if (m.Mapping(res, m.Name))
                {
                    m.PostData();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

【问题讨论】:

    标签: c# multithreading serial-port


    【解决方案1】:

    你的第二个if(true)有一个错字:

    _serialPortB.Handshake = machineB.Handshake;

    _serialPort10.DataReceived += new SerialDataReceivedEventHandler((sender3, e3) => DataReceivedHandler(sender3, e3, machineB));

    因此,您没有将事件连接到 _serialPortB,而是连接到不同的端口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 2016-03-17
      相关资源
      最近更新 更多