|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.ComponentModel;
|
|
|
using System.Linq;
|
|
|
using System.Text;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
#region << 版 本 注 释 >>
|
|
|
/*--------------------------------------------------------------------
|
|
|
* 版权所有 (c) 2024 WenJY 保留所有权利。
|
|
|
* CLR版本:4.0.30319.42000
|
|
|
* 机器名称:T14-GEN3-7895
|
|
|
* 命名空间:ConsoleApp
|
|
|
* 唯一标识:156ff13b-84fd-4062-a001-afc6a5d185b2
|
|
|
*
|
|
|
* 创建者:WenJY
|
|
|
* 电子邮箱:
|
|
|
* 创建时间:2024-05-22 11:15:41
|
|
|
* 版本:V1.0.0
|
|
|
* 描述:
|
|
|
*
|
|
|
*--------------------------------------------------------------------
|
|
|
* 修改人:
|
|
|
* 时间:
|
|
|
* 修改说明:
|
|
|
*
|
|
|
* 版本:V1.0.0
|
|
|
*--------------------------------------------------------------------*/
|
|
|
#endregion << 版 本 注 释 >>
|
|
|
namespace ConsoleApp
|
|
|
{
|
|
|
public class HIDInterface : IDisposable
|
|
|
{
|
|
|
|
|
|
public enum MessagesType
|
|
|
{
|
|
|
Message,
|
|
|
Error
|
|
|
}
|
|
|
|
|
|
public struct ReusltString
|
|
|
{
|
|
|
public bool Result;
|
|
|
public string message;
|
|
|
}
|
|
|
|
|
|
public struct HidDevice
|
|
|
{
|
|
|
public UInt16 vID;
|
|
|
public UInt16 pID;
|
|
|
public string serial;
|
|
|
}
|
|
|
HidDevice lowHidDevice = new HidDevice();
|
|
|
|
|
|
public delegate void DelegateDataReceived(object sender, byte[] data);
|
|
|
public DelegateDataReceived DataReceived;
|
|
|
|
|
|
public delegate void DelegateStatusConnected(object sender, bool isConnect);
|
|
|
public DelegateStatusConnected StatusConnected;
|
|
|
|
|
|
public bool bConnected = false;
|
|
|
|
|
|
|
|
|
public Hid oSp = new Hid();
|
|
|
private static HIDInterface m_oInstance;
|
|
|
|
|
|
public struct TagInfo
|
|
|
{
|
|
|
public string AntennaPort;
|
|
|
public string EPC;
|
|
|
}
|
|
|
|
|
|
public HIDInterface()
|
|
|
{
|
|
|
m_oInstance = this;
|
|
|
oSp.DataReceived = HidDataReceived;
|
|
|
oSp.DeviceRemoved = HidDeviceRemoved;
|
|
|
}
|
|
|
|
|
|
protected virtual void RaiseEventConnectedState(bool isConnect)
|
|
|
{
|
|
|
if (null != StatusConnected) StatusConnected(this, isConnect);
|
|
|
}
|
|
|
|
|
|
protected virtual void RaiseEventDataReceived(byte[] buf)
|
|
|
{
|
|
|
if (null != DataReceived) DataReceived(this, buf);
|
|
|
}
|
|
|
|
|
|
public void AutoConnect(HidDevice hidDevice)
|
|
|
{
|
|
|
lowHidDevice = hidDevice;
|
|
|
ContinueConnectFlag = true;
|
|
|
ReadWriteThread.DoWork += ReadWriteThread_DoWork;
|
|
|
ReadWriteThread.WorkerSupportsCancellation = true;
|
|
|
ReadWriteThread.RunWorkerAsync(); //Recommend performing USB read/write operations in a separate thread. Otherwise,
|
|
|
}
|
|
|
|
|
|
public void StopAutoConnect()
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
ContinueConnectFlag = false;
|
|
|
Dispose();
|
|
|
}
|
|
|
catch
|
|
|
{
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
~HIDInterface()
|
|
|
{
|
|
|
Dispose();
|
|
|
}
|
|
|
|
|
|
public bool Connect(HidDevice hidDevice)
|
|
|
{
|
|
|
ReusltString result = new ReusltString();
|
|
|
|
|
|
Hid.HID_RETURN hdrtn = oSp.OpenDevice(hidDevice.vID, hidDevice.pID, hidDevice.serial);
|
|
|
|
|
|
if (hdrtn == Hid.HID_RETURN.SUCCESS)
|
|
|
{
|
|
|
|
|
|
bConnected = true;
|
|
|
|
|
|
#region 消息通知
|
|
|
result.Result = true;
|
|
|
result.message = "Connect Success!";
|
|
|
RaiseEventConnectedState(result.Result);
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
bConnected = false;
|
|
|
|
|
|
#region 消息通知
|
|
|
result.Result = false;
|
|
|
result.message = "Device Connect Error";
|
|
|
RaiseEventConnectedState(result.Result);
|
|
|
|
|
|
#endregion
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
|
|
|
public bool Send(byte[] byData)
|
|
|
{
|
|
|
byte[] sendtemp = new byte[byData.Length + 1];
|
|
|
sendtemp[0] = (byte)byData.Length;
|
|
|
Array.Copy(byData, 0, sendtemp, 1, byData.Length);
|
|
|
|
|
|
Hid.HID_RETURN hdrtn = oSp.Write(new report(0, sendtemp));
|
|
|
|
|
|
if (hdrtn != Hid.HID_RETURN.SUCCESS)
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
public bool Send(string strData)
|
|
|
{
|
|
|
//获得报文的编码字节
|
|
|
byte[] data = Encoding.Unicode.GetBytes(strData);
|
|
|
return Send(data);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void DisConnect()
|
|
|
{
|
|
|
bConnected = false;
|
|
|
|
|
|
Thread.Sleep(200);
|
|
|
if (oSp != null)
|
|
|
{
|
|
|
oSp.CloseDevice();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
void HidDeviceRemoved(object sender, EventArgs e)
|
|
|
{
|
|
|
bConnected = false;
|
|
|
#region 消息通知
|
|
|
ReusltString result = new ReusltString();
|
|
|
result.Result = false;
|
|
|
result.message = "Device Remove";
|
|
|
RaiseEventConnectedState(result.Result);
|
|
|
#endregion
|
|
|
if (oSp != null)
|
|
|
{
|
|
|
oSp.CloseDevice();
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
public void HidDataReceived(object sender, report e)
|
|
|
{
|
|
|
|
|
|
try
|
|
|
{
|
|
|
//第一个字节为数据长度,因为Device 的HID数据固定长度为64字节,取有效数据
|
|
|
byte[] buf = new byte[e.reportBuff[0]];
|
|
|
Array.Copy(e.reportBuff, 1, buf, 0, e.reportBuff[0]);
|
|
|
|
|
|
//推送数据
|
|
|
RaiseEventDataReceived(buf);
|
|
|
}
|
|
|
catch
|
|
|
{
|
|
|
#region 消息通知
|
|
|
ReusltString result = new ReusltString();
|
|
|
result.Result = false;
|
|
|
result.message = "Receive Error";
|
|
|
RaiseEventConnectedState(result.Result);
|
|
|
#endregion
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
public void Dispose()
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
this.DisConnect();
|
|
|
oSp.DataReceived -= HidDataReceived;
|
|
|
oSp.DeviceRemoved -= HidDeviceRemoved;
|
|
|
ReadWriteThread.DoWork -= ReadWriteThread_DoWork;
|
|
|
ReadWriteThread.CancelAsync();
|
|
|
ReadWriteThread.Dispose();
|
|
|
}
|
|
|
catch
|
|
|
{ }
|
|
|
}
|
|
|
|
|
|
Boolean ContinueConnectFlag = true;
|
|
|
private BackgroundWorker ReadWriteThread = new BackgroundWorker();
|
|
|
private void ReadWriteThread_DoWork(object sender, DoWorkEventArgs e)
|
|
|
{
|
|
|
while (ContinueConnectFlag)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
if (!bConnected)
|
|
|
{
|
|
|
Connect(lowHidDevice);
|
|
|
|
|
|
}
|
|
|
Thread.Sleep(500);
|
|
|
}
|
|
|
catch { }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|