在学习板上可以正常收发数据 , 但转到开发板上发送的数据可以正常发送,但是开发板接收不到, 开发板和调试助手可以正常调试的,不知道有没有大神遇到这种问题?
buffer = new byte[outputReportLength];
buffer[0] = r.reportID;
int maxBufferLength = 0;
if (r.reportBuff.Length < outputReportLength - 1)
maxBufferLength = r.reportBuff.Length;
else
maxBufferLength = outputReportLength - 1;
for (int i = 1; i < maxBufferLength; i++)
buffer[i] = r.reportBuff[i - 1];
hidDevice.Write(buffer, 0, OutputReportLength);
对比一下给学习板和开发板发送的buffer和OutputReportLength是否一样
学习板的outputreportLength是2 然后我这边就发送两个字节, 下位机可以正常收发。
开发板的ou'tputrepo'rtLength获取的是65,但其实是64,我就发送65个字节会报错, 发送64个字节没报错,但是下位机收取不到
1、为什么学习板发过来的是两个字节,而开发板发过来的是65个字节,协议不一样?
2、给开发板发送65个字节是开发板报错吧?报错是报的什么错,是没有按照协议回复?
估计是你没有按照通讯协议收发信息
学习板上定的长度就是2个字节
开发版上的定的长度是64个字节, 但上位机收到outputreportlength是65,发65字节报"参数错误", 发64个字节可以正常发,但是开发板收不到数据
我今天让他们换个开发板试试
你有c# hid方面的成功使用的代码吗, 我可以和你的代码参考下
for (int i = 0; i < maxBufferLength; i++)
buffer[i + 1] = r.reportBuff[i];
这个buffer我现在就直接手动赋值了
这个创建通信类的的代码
public HID_RETURN OpenDevice(UInt16 vID, UInt16 pID)
{
// IntPtr hInfoSet = SetupDiGetClassDevs(ref gHid, null, IntPtr.Zero, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
if (deviceOpened == false)
{
//获取连接的HID列表
List<string> deviceList = new List<string>();
GetHidDeviceList(ref deviceList);
if (deviceList.Count == 0)
return HID_RETURN.NO_DEVICE_CONECTED;
for (int i = 0; i < deviceList.Count; i++)
{
device = CreateFile(deviceList[i], DESIREDACCESS.GENERIC_READ | DESIREDACCESS.GENERIC_WRITE, 0, 0, CREATIONDISPOSITION.OPEN_EXISTING, FLAGSANDATTRIBUTES.FILE_FLAG_OVERLAPPED, 0);
if (!device.IsInvalid)
{ // strDevicePath = GetDevicePath(hInfoSet, ref oInterface);
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) // && deviceStr == serial
{
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(device, FileAccess.ReadWrite, inputReportLength, true);
deviceOpened = true;
//BeginAsyncRead();
Guid gHid = HIDGuid;
IntPtr hInfoSet = SetupDiGetClassDevs(ref gHid, null, IntPtr.Zero, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
DeviceInterfaceData oInterface = new DeviceInterfaceData();
strDevicePath = GetDevicePath(hInfoSet, ref oInterface);
bool canRead = hidDevice.CanRead; //获取一个值,该值指示当前流是否支持读取。
bool canWrite = hidDevice.CanWrite; //获取一个值,该值指示当前流是否支持写入。
return HID_RETURN.SUCCESS;
}
}
}
return HID_RETURN.DEVICE_NOT_FIND;
}
else
return HID_RETURN.DEVICE_OPENED;
}
顶起,usbhid,只能发64个字节,下位机返回时第一个字节有特殊用途具体干啥的忘记了,实际有效数据为63个字节论坛发帖机
大错特错,发65字节=1字节report id + 64 data