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
相关产品推荐
相关产品推荐

