c#USBHID上位机测试软件制作只能读不能写
/// <summary>/// 创建链接句柄
/// </summary>
/// <param name="lpFileName"></param>
/// <returns></returns>
private bool CreateHandle(string lpFileName)
{
bool ret = false;
if (isOpened == false)
{
// 以写访问打开此HID设备
hidWriteHandle = CreateFile(lpFileName, FILE_ACCESS_MASK.GENERIC_WRITE,
FILE_SHARE_MODE.FILE_SHARE_WRITE | FILE_SHARE_MODE.FILE_SHARE_READ, 0, FILE_CREATION_DISPOSITON.OPEN_EXISTING, 0, 0);
// 以读访问打开此HID设备;
hidReadHandle = CreateFile(lpFileName, FILE_ACCESS_MASK.GENERIC_READ,
FILE_SHARE_MODE.FILE_SHARE_WRITE | FILE_SHARE_MODE.FILE_SHARE_READ, 0, FILE_CREATION_DISPOSITON.OPEN_EXISTING, 0, 0);
if (hidReadHandle != null && hidWriteHandle != null)
{
GetDeviceCapabilities(hidReadHandle);
//StartBackgroundRead();
isOpened = true;
ret = true;
}
else
{
}
}
return ret;
}
/// <summary>
/// 写数据操作
/// </summary>
/// <param name="outPacket"></param>
/// <returns></returns>
public bool Write(byte[] outPacket)
{
if (isOpened)
{
uint bytesWritten = 0;
bool ret = false;
ret = WriteFile(hidWriteHandle, outPacket, (uint)outPacket.Length, ref bytesWritten, IntPtr.Zero);
return ret;
}
return false;
}
/// <summary>
/// 读数据操作
/// </summary>
/// <param name="inPacket"></param>
/// <returns></returns>
public bool Read(ref byte[] inPacket)
{
if (isOpened)
{
uint bytesRead = 1;
// 默认Report ID;
return ReadFile(hidReadHandle, inPacket, (uint)inPacket.Length, ref bytesRead, IntPtr.Zero);
}
return false;
}
数据写老是失败不知怎么原因。。。请大师指导!
hidReadHandle = CreateFile(lpFileName, FILE_ACCESS_MASK.GENERIC_READ,
FILE_SHARE_MODE.FILE_SHARE_WRITE | FILE_SHARE_MODE.FILE_SHARE_READ, 0, FILE_CREATION_DISPOSITON.OPEN_EXISTING, 0, 0);
你用读权限打开的,肯定不能写了. 哈哈,真的可能是你打开设备的设备的时候没给写的权限
apple_eat 发表于 2015-9-24 11:37
hidReadHandle = CreateFile(lpFileName, FILE_ACCESS_MASK.GENERIC_READ,
FILE_SHARE ...
读权限打开了就不能写了吗?
不知道怎样弄一个能读有能写的机制,
/// <summary>
/// 打开指定信息的设备
/// </summary>
/// <param name="vID">设备的vID</param>
/// <param name="pID">设备的pID</param>
/// <param name="serial">设备的serial</param>
/// <returns></returns>
public HID_RETURN OpenDevice(UInt16 vID, UInt16 pID, string sPth)
{
if (deviceOpened == false)
{
if (sPth == "")
return HID_RETURN.NO_DEVICE_CONECTED;
IntPtr device = CreateFile(sPth, DESIREDACCESS.GENERIC_READ | DESIREDACCESS.GENERIC_WRITE,
FILE_SHARE_MODE.FILE_SHARE_WRITE | FILE_SHARE_MODE.FILE_SHARE_READ, 0, CREATIONDISPOSITION.OPEN_EXISTING, 0x40000000, 0);
DeviceHandle = device;
if (device != null)
{
HIDD_ATTRIBUTES attributes;
IntPtr serialBuff = Marshal.AllocHGlobal(512);
HidD_GetAttributes(device, out attributes);
HidD_GetSerialNumberString(device, serialBuff, 512);
string deviceStr = Marshal.PtrToStringAuto(serialBuff);
Marshal.FreeHGlobal(serialBuff);
if (attributes.VendorID == vID && attributes.ProductID == pID)
{
IntPtr preparseData;
HIDP_CAPS caps;
HidD_GetPreparsedData(device, out preparseData);
HidP_GetCaps(preparseData, out caps);
HidD_FreePreparsedData(preparseData);
outputReportLength = caps.OutputReportByteLength;
inputReportLength = caps.InputReportByteLength;
hidDevice = new FileStream(new SafeFileHandle(device, true), FileAccess.Read, inputReportLength, true);
deviceOpened = true;
BeginAsyncRead();
return HID_RETURN.SUCCESS;
}
}
return HID_RETURN.DEVICE_NOT_FIND;
}
else
return HID_RETURN.DEVICE_OPENED;
}
这个也只只能读,写不出去,用BusHound监测没见有OUT的数据。。。
页:
[1]