Winform SerialPort 串口扫码枪实例


        SerialPort serialPort = new SerialPort();
/// <summary>
        /// 初始化串口
        /// </summary>
        private void InitSerialPort()
        {
            log4netHelper.Info($"初始化串口开始");
            try
            {
                #region MyRegion
                if (serialPort.IsOpen)
                    serialPort.Close();
                //端口名  注:设备管理器中查看一下虚拟com口的名字
                string PortName = ConfigurationManager.AppSettings["PortName"].ToString();
                string BaudRate = ConfigurationManager.AppSettings["BaudRate"].ToString();
                string DataBits = ConfigurationManager.AppSettings["DataBits"].ToString();
                serialPort.PortName = !string.IsNullOrEmpty(PortName) ? PortName : "COM5";//串口
                serialPort.BaudRate = !string.IsNullOrEmpty(BaudRate) ? Convert.ToInt32(BaudRate) : 9600;//波特率,默认是9600
                serialPort.DataBits = !string.IsNullOrEmpty(DataBits) ? Convert.ToInt32(DataBits) : 1;//数据位
                serialPort.Parity = Parity.None;//校验位
                serialPort.StopBits = StopBits.One;//停止位
                serialPort.DiscardNull = true;
                serialPort.ReadTimeout = 1000;//设置读取超时时间为1秒
                serialPort.WriteTimeout = 1000; //设置写入超时时间为1秒
                if (!serialPort.IsOpen)
                {
                    serialPort.Close();
                }
                serialPort.Open();
                log4netHelper.Info($"初始化串口成功");
                serialPort.DataReceived += serialPort_DataReceived;//监听方法,具体看下面
                #endregion
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message);
                log4netHelper.Info($"ERROR发生错误,扫描数据失败:{ex.Message}");
            }
        }
/// <summary>
        /// 串口数据接收事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            try
            {
                log4netHelper.Info($"serialPort_DataReceived");
                SerialPort serialPort = (SerialPort)sender;
                log4netHelper.Info($"串口接收长度:{serialPort.BytesToRead}");
                if (serialPort.BytesToRead == 0)
                {
                    return;
                }
                else
                {
                    #region
                    //Thread threadReceiveSub = new Thread(new ParameterizedThreadStart(ReceiveData));
                    //threadReceiveSub.Start(serialPort);
                    #endregion

                    #region
                    System.Threading.Thread.Sleep(200);//防止数据接收不完整 线程sleep(200)
                    //SerialPort serialPort = (SerialPort)serialPortobj;
                    //开辟接收缓冲区
                    byte[] receiveData = new byte[serialPort.BytesToRead];

                    //从串口读取数据
                    serialPort.Read(receiveData, 0, receiveData.Length);//同步读取数据
                    log4netHelper.Info($"串口接收数据为:" + receiveData + ",System.Text.Encoding.UTF8.GetString编码后" + System.Text.Encoding.UTF8.GetString(receiveData) + ",长度为:" + receiveData.Length);
                    string curBarCode = System.Text.Encoding.UTF8.GetString(receiveData, 0, receiveData.Length);
                    serialPort.ReadExisting();

                    if (string.IsNullOrEmpty(curBarCode))
                    {
                        this.UIThreadInvoke(new Action(() => { this.txtBarCode.Text = ""; }));
                        log4netHelper.Info($"串口接收数据转换结果为空!");
                        return;
                    }
                    else
                    {
                        //定义一个委托(delegate),委托(delegate)可以将参数与方法传递给控件所在的线程,并由控件所在的线程执行,通过Invoke来调用,这样可以完美的解决“线程间操作无效,从不是创建控件的线程访问它”
                        Action action = () =>
                        {
                            log4netHelper.Info($"串口接收数据转换结果为:" + curBarCode);
                            this.txtBarCode.Text = curBarCode;
                            int rowCount = IsBarcodeExist(curBarCode);//校验产品条码是否存在
                            if (rowCount > 0)
                            {
                                string msg = string.Format("产品条码信息【{0}】已存在,请重新扫码!", this.txtBarCode.Text.Trim());
                                log4netHelper.Info(msg);
                                this.lblResult.Text = msg;
                                this.lampStart.Status = Status.Close;
                                devActors[DevFullName].WriteChannelValue("Screwed_Start", 201);//向PCL中写入当前产品型号
                                log4netHelper.Info($"Screwed_Start写入PLC失败");
                                return;
                            }

                            WriteBarcodeToPLC(curBarCode, true);//将条码写到PCL
                            this.lampStart.Status = Status.OK;//开始信号灯
                            devActors[DevFullName].WriteChannelValue("Screwed_Start", 200);//向PCL中写入扫
                            log4netHelper.Info($"Screwed_Start写入PLC成功");

                            InitController();//初始化控件
                        };
                        Invoke(action);
                        log4netHelper.Info($"扫描截取信息:{curBarCode}");
                    }
                    serialPort.DiscardInBuffer();//丢弃来自串行驱动程序的接收缓冲区的数据
                    #endregion

                }
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message);
                log4netHelper.Info("ERROR发生错误,扫描数据失败:" + ex.Message + "," + ex.StackTrace.ToString());
            }
        }

### 回答1: 在使用 WinForm 监听 USB 扫码枪输入时,可以采用以下步骤: 首先,我们需要使用 C# 代码编写 WinForm 窗体应用程序。在设计窗体时,我们可以添加一个文本框用于显示扫码枪输入的内容。同时,我们还需要添加一个事件监听器来监听 USB 扫码枪的输入。 在代码中,我们可以使用 `System.IO.Ports` 命名空间中的 `SerialPort` 类来监听 USB 扫码枪输入。我们先实例化一个 `SerialPort` 对象,并设置相关的属性,如扫码枪串口号、波特率、奇偶校验等。然后,我们可以通过绑定 `DataReceived` 事件来获取输入数据。 在 `DataReceived` 事件处理程序中,我们可以将扫码枪的输入数据读取到一个字符串变量中,并通过委托将其显示在窗体的文本框内。 在窗体的加载事件中,我们需要打开串口连接以接收扫码枪的输入。在窗体关闭事件中,我们应该关闭串口连接。 最后,我们可以运行该应用程序并连接 USB 扫码枪。当扫码枪输入时,应用程序将能够监听到数据并显示在窗体的文本框中。 需要注意的是,不同的扫码枪可能有不同的通信协议和设置,因此在监听和解析扫码枪输入数据时,可能需要进行一些额外的处理和适配。 通过以上步骤,我们可以实现在 WinForm监听 USB 扫码枪输入并对其进行处理。 ### 回答2: 要在WinForm应用中实现监听USB扫码枪输入,需要使用C#语言和相关的API。首先,需要在WinForm界面中添加一个文本框控件来显示扫码枪输入的数据。 然后,需要使用`System.Management`命名空间下的`ManagementEvents`类来监听USB设备的插拔事件。可以编写一个方法来订阅USB设备的插拔事件,并在事件处理程序中判断扫码枪是否插入或拔出。如果扫码枪插入,就需要继续进行后续操作。 接下来,需要使用`System.IO.Ports`命名空间下的`SerialPort`类来监听串口数据的输入。由于大多数USB扫码枪模拟为串口设备,可以通过设置串口名称、波特率等参数来与扫码枪进行通信,并在数据接收事件中获取到扫码枪输入的数据。 在WinForm中,可以通过订阅`SerialPort`类的`DataReceived`事件来监听串口数据的输入。在事件处理程序中可以将获取到的数据写入到之前添加的文本框控件中,以实现实时显示扫码枪输入的数据。 在应用程序退出时或扫码枪拔出时,需要及时释放相关资源,关闭串口连接等。可以通过在`FormClosing`事件中进行相关操作来确保资源的释放。 综上所述,以上是实现WinForm监听USB扫码枪输入的一般步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值