我正在将STM32F103与“ STM32_USB-FS-Device_Lib_V4.0.0”一起使用,以将数据发送到PC。 STM32中的发送函数为:
void USB_Send(unsigned char *p,u8 len)
{
UserToPMABufferCopy(p, GetEPTxAddr(ENDP1), len);
SetEPTxCount(ENDP1, len);
SetEPTxValid(ENDP1);
while(GetEPTxStatus(ENDP1)!=EP_TX_NAK);
}
但是奇怪的是,当len = 64时,我编写的C#程序和我下载的调试工具正确接收了数据。但是,当len <64时,什么也收不到。我尝试了“ Bus Hound” USB数据包嗅探器,该嗅探器可以记录少于64个的数据包,但是我的程序中从未输入过readdata函数。
我还尝试在STM32程序中更改ConfigDescriptor中的MaxPacketSize值和ReportDescriptor中的REPORT_COUNT值,但是它们不起作用。
HID是否限制一个数据包的长度必须为某个值,如果长度小于该值,则必须在数据包末尾填充额外的数据,直到长度等于特定值为止。
有人可以给我一些帮助或提示,谢谢!
补语:
我试图无延迟地发送两个32Bytes数据包,但这没有用。
这是我的C#接收代码:
//Init code:
HIDP_CAPS capabilities = new HIDP_CAPS();
int hidCapsSucsess = HidP_GetCaps(ptrToPreParsedData, ref capabilities); //HidP_GetCaps is a win API
SafeFileHandle handle_read = CreateFile(devicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero); //CreateFile is a win API
FileStream FS_read = new FileStream(handle_read, FileAccess.ReadWrite, capabilities.OutputReportByteLength, false);
//...
//Receive code:
public byte[] read()
{
byte[] readBuf = new byte[capabilities.OutputReportByteLength];
FS_read.Read(readBuf, 0, capabilities.OutputReportByteLength);
return readBuf;
}
我试图在STM32的ReportDescriptor中更改输出的REPORT_COUNT的值。断点调试显示“ capabilities.OutputReportByteLength”已更改,但奇怪的是它等于REPORT_COUNT + 1。此外,当“ capabilities.OutputReportByteLength”小于65时,发生错误:“ 提供的用户缓冲区对于“ FS_read.Read”中的请求操作无效”。