一、开发准备
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);
}
}
}
}