|
发表于 2020-4-22 11:11:21
|
显示全部楼层
HidStream gHidStream;
//2 打开usb设备
if (!device.TryOpen(out gHidStream))
{
MessageBox.Show("打开VID:" + DEVICE_VID.ToString("X04") + " PID:" + DEVICE_PID.ToString("X04") + "失败");
goto WorkEnd;
}
else
{
//MessageBox.Show("打开成功!");
}
//3 设置异步读数据
StateObject stateobj = new StateObject();
stateobj.hidstream = gHidStream;
gHidStream.BeginRead(stateobj.buffer, 0, StateObject.BUFFSIZE,
new AsyncCallback(ReadCallBack),
stateobj);
public static void ReadCallBack(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
HidStream handler = state.hidstream;
int bytesread = 0;
//[0] [1] [2] [3] ... [62] [63]
//05 len d0 d1 d60 sum
try
{
if (handler.CanRead)
{
bytesread = handler.EndRead(ar);
//Console.WriteLine("bytesread=" + bytesread.ToString("D"));
if (bytesread > 0)
{
//Console.WriteLine("bytesread=" + bytesread.ToString("D"));
byte sum = CalcSum2(state.buffer, 63);
if (state.buffer[63] != sum)
{
Console.WriteLine("(state.buffer[63] != sum");
return;
}
for (int i = 0; i < state.buffer[1]; i++)
{
PushOne(state.buffer[i + 2]);
//Console.Write(state.buffer[i + 2].ToString("X2") + " ");
}
}
}
}
catch (Exception err)
{
//Console.WriteLine("1 " + err.Message);
if (err.Message.Contains("Operation failed early"))
{
MessageBox.Show("设备已拔出!");
//need to call StopWork
WorkFlag = false;
}
else if (err.Message.Contains("Closed"))
{
//do not execute BeginRead
return;
}
}
try
{
Array.Clear(state.buffer, 0, StateObject.BUFFSIZE);
handler.BeginRead(state.buffer, 0, StateObject.BUFFSIZE,
new AsyncCallback(ReadCallBack),
state);
}
catch (Exception err)
{
//Console.WriteLine("2 " + err.Message);
}
}
public class StateObject
{
public const int BUFFSIZE = 128;
public byte[] buffer = new byte[BUFFSIZE];
public HidStream hidstream;
} |
|