You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#读取串口条码阅读器数据问题:DataReceived事件未触发

USB条码阅读器虚拟COM3连接,C# WinForm DataReceived事件不触发的解决方法

设备通过虚拟COM端口连接到COM3,在记事本、Excel中可正常读取数据,但自行开发的C# Windows窗体应用中BarCodeReader1_DataReceived事件始终未执行,代码如下:

using System;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        SerialPort port = new SerialPort("COM3", 115200, Parity.None, 8, StopBits.One);

        public Form1()
        {
            InitializeComponent();
            BarCodeReader1.PortName = "COM3";
            BarCodeReader1.BaudRate = 115200;   // 19200;
            BarCodeReader1.Parity = Parity.None;
            BarCodeReader1.DataBits = 8;
            BarCodeReader1.StopBits = StopBits.One;
            BarCodeReader1.Handshake = Handshake.None;
            BarCodeReader1.RtsEnable = true;
        }

        private void cmd_Exit_Click(object sender, EventArgs e)
        {
            if ((BarCodeReader1.IsOpen))
                BarCodeReader1.Close();

            this.Close();
        }

        private void cmd_Start_Click(object sender, EventArgs e)
        {
            try
            {
                if (!(BarCodeReader1.IsOpen))
                    BarCodeReader1.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();

            foreach (string port in ports)
            {
                richTextBox1.Text += port + (char)13 + (char)10;
            }
        }

        private void BarCodeReader1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string l_Data = BarCodeReader1.ReadExisting();
            textBox1.Text = l_Data;
        }
    }
}

解决步骤

  • 绑定DataReceived事件
    事件未触发大概率是因为没有完成事件绑定。可以在Form构造函数中添加代码绑定:

    public Form1()
    {
        InitializeComponent();
        // 其他串口参数设置...
        BarCodeReader1.DataReceived += BarCodeReader1_DataReceived;
    }
    

    或者在Visual Studio设计器中,选中BarCodeReader1控件,在属性窗口的事件列表里找到DataReceived,选择对应的处理方法。

  • 修复跨线程UI访问问题
    DataReceived事件在后台线程触发,直接修改UI控件会导致线程安全问题,可能静默失败。需要切换到UI线程更新:

    private void BarCodeReader1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        string l_Data = BarCodeReader1.ReadExisting();
        textBox1.Invoke(new Action(() => {
            textBox1.Text = l_Data;
        }));
    }
    
  • 核对串口参数与设备匹配
    确认波特率、奇偶校验、数据位、停止位完全匹配设备实际参数。部分条码阅读器会以换行符作为数据结束标记,可尝试设置:

    BarCodeReader1.NewLine = "\r\n";
    // 并将ReadExisting替换为ReadLine
    string l_Data = BarCodeReader1.ReadLine();
    
  • 验证串口是否成功打开
    在打开串口后添加确认提示,排除串口未正常打开的情况:

    private void cmd_Start_Click(object sender, EventArgs e)
    {
        try
        {
            if (!(BarCodeReader1.IsOpen))
            {
                BarCodeReader1.Open();
                MessageBox.Show("串口已成功打开");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
        }
    }
    
  • 移除多余SerialPort实例
    代码中声明的全局SerialPort port实例未被使用,建议移除避免混淆。

内容的提问来源于stack exchange,提问作者Nitin Gandevikar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:22:51