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());
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值