【扫描抢】一台电脑多台扫描抢多个软件(串口+USB)

一、开发准备

1.1、硬件

1.1.1、扫描抢

通讯接口支持:RS232,USB

接口:10芯网线网线母线

1.1.2、连接线

定制线,规格 10芯网线公头 → 适配器电源线+RS232 串口线

二、开发

其中使用到UsbScanner.dll进行USB通讯,见资源 按设备名称识别扫描内容,一台电脑多个扫描抢多个软件 

using DevMonitorServerDoNet.Models;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Entity.Infrastructure;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DevMonitorServerDoNet.MyEvent;
using UsbScanner.RawInput;

namespace DevMonitorServerDoNet.BIZ
{
    /// <summary>
    /// 扫描枪 - 串口
    /// </summary>
    public class Scanner
    {
        log4net.ILog log = log4net.LogManager.GetLogger(typeof(Scanner));
        private SerialPort scanner = new SerialPort();
        private UsbScanner.RawScannerDataForm usbScanner = null;
        string PortNo = ConfigurationManager.AppSettings["ScanerPortNo1"];
        int MachineID = Convert.ToInt32(ConfigurationManager.AppSettings["MachineID"]);
        List<byte> ScannerList = new List<byte>();
        public Scanner()
        {
            Initialization();
        }
        private void Initialization()
        {
            scanner.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
            Open();
        }
       
        private int Open()
        {
            try
            {
                if (PortNo.Length>3 && PortNo.Substring(0,3).ToUpper() == "COM")
                {
                    scanner.PortName = PortNo;
                    scanner.BaudRate = 9600;
                    scanner.Parity = (Parity)0;
                    scanner.DataBits = 8;
                    scanner.StopBits = (StopBits)1;
                    scanner.Open();
                    log.Info("Open Success!");
                    return 0;
                }
                else if (PortNo.Length > 6 && PortNo.Substring(0, 2).ToUpper() == @"\\")
                {
                    usbScanner = new UsbScanner.RawScannerDataForm(PortNo,IntPtr.Zero);
                    usbScanner.ReceviedData += new RawScannerData.DelegateReceviedData(Update2);
                    return 0;
                }
                else
                {
                    log.Warn("appSettings/ScanerPortNo1 invalid:");
                    return 1;
                }
            }
            catch (Exception ex)
            {
                log.Error("Open Exception:" + ex.Message);
                return -1;
            }
        }
     
        private void DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                byte[] ReDatas = new byte[scanner.BytesToRead];
                scanner.Read(ReDatas, 0, ReDatas.Length);//读取数据
                AddList(ScannerList, ReDatas);
                log.Info("Scanning Bar/QR Code:" + System.Text.Encoding.UTF8.GetString(ReDatas));
            }
            catch (Exception ex)
            {
                log.Error("DataReceived Exception:" + ex.Message);
            }
        }
      
        private void AddList(List<byte> list, byte[] ReDatas)
        {
            try
            {
                foreach (var a in ReDatas)
                {
                    if (a == 0x0a && list.Count > 1 && list[list.Count - 1] == 0x0d)
                    {
                        list.RemoveAt(list.Count - 1);
                        Update(System.Text.Encoding.UTF8.GetString(list.ToArray()));
                        list.Clear();
                        continue;
                    }
                    else
                    {
                    }
                    list.Add(a);
                }
            }
            catch (Exception ex)
            {
                log.Error("AddList Exception:" + ex.Message);
            }
        }
        private void Update2(string name,string code)
        {
            Update(code);
        }
        /// <summary>
        /// 更新数据库
        /// </summary>
        /// <param name="code"></param>
        private void Update(string code)
        {
            try
            {
                using (RssEntities db = new RssEntities())
                {
                    device_monitor entity = db.device_monitor.Where(p => p.dev_type == "SCAN" && p.dev_name == "COM_MSC" && p.machine_id == MachineID).FirstOrDefault();
                    if (entity != null)
                    {
                        entity.dev_value = code;
                        entity.dev_value2 = "0";
                        db.device_monitor.Attach(entity);
                        var stateEntity = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager.GetObjectStateEntry(entity);
                        stateEntity.SetModifiedProperty("dev_value");
                        stateEntity.SetModifiedProperty("dev_value2");
                        db.SaveChanges();
                        log.Info("Update device_monitor code:" + code + " MachineID:" + MachineID);
                    }
                    else
                    {
                        entity = new device_monitor()
                        {
                            dev_name = "COM_MSC",
                            dev_type = "SCAN",
                            dev_value = code,
                            dev_value2 = "0",
                            machine_id = MachineID,
                            last_stamp = DateTime.Now
                        };
                        db.device_monitor.Add(entity);
                        db.SaveChanges();
                        log.Info("Insert device_monitor code:" + code + " MachineID:" + MachineID);
                    }
                }
            }
            catch (Exception ex)
            {
                log.Error("Update device_monitor code:" + code + " MachineID:" + MachineID + ex.Message);
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值