You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

263 lines
6.7 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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 { }
}
}
}
}