Запись на USB-устройство через WinUsb
ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ:
Теперь у меня есть строка, совместимая с моим устройством (она должна быть в определенном формате непечатаемых байтов), но бесконечный цикл. Программа никогда не выходит из WinUsb_WritePipe.
ОРИГИНАЛЬНАЯ ПРОБЛЕМА:
После инициализации всего моего интерфейса WinUsb (как это было сделано в этом хорошо сделанном руководстве по MSDN: https://msdn.microsoft.com/en-us/library/windows/hardware/ff540174(v=vs.85).aspx)
У меня все хорошо настроено и отправлено правда без ошибок, кроме последнего шага.
PWINUSB_INTERFACE_HANDLE piUsbHandle = new WINUSB_INTERFACE_HANDLE();
USB_INTERFACE_DESCRIPTOR *eUsbInterfaceDescriptor = new USB_INTERFACE_DESCRIPTOR();
WinUsb_Initialize(sfhDeviceHandle, piUsbHandle) //true
devInfo->winUsbHandle = *piUsbHandle;
WinUsb_QueryInterfaceSettings(*piUsbHandle, 1, eUsbInterfaceDescriptor) //true
for (int i= 0; i <= eUsbInterfaceDescriptor->bNumEndpoints - 1; i++)
{
if (!WinUsb_QueryPipe((WINUSB_INTERFACE_HANDLE)devInfo->winUsbHandle, 1, (unsigned char)i, &eWinUsbPipeInformation))
{
return NULL;
}
if (((eWinUsbPipeInformation.PipeType == UsbdPipeTypeBulk)
& this->isUsbEndPointDirectionIn(eWinUsbPipeInformation.PipeId)))
{
UtilityFunctions::displayTrace("initializeDevice : devInfo->bulkInPipe set");
std::cout << "New In Pipe = " << (int)eWinUsbPipeInformation.PipeId << std::endl;
devInfo->bulkInPipe = eWinUsbPipeInformation.PipeId;
}
else if (((eWinUsbPipeInformation.PipeType == UsbdPipeTypeBulk)
& this->isUsbEndpointDirectionOut(eWinUsbPipeInformation.PipeId)))
{
UtilityFunctions::displayTrace("initializeDevice : devInfo->bulkOutPipe set");
std::cout << "New Out Pipe = " << (int)eWinUsbPipeInformation.PipeId << std::endl;
devInfo->bulkOutPipe = eWinUsbPipeInformation.PipeId;
}
else if (((eWinUsbPipeInformation.PipeType == UsbdPipeTypeInterrupt)
& this->isUsbEndPointDirectionIn(eWinUsbPipeInformation.PipeId)))
{
UtilityFunctions::displayTrace("initializeDevice : devInfo->InterruptInPipe set");
devInfo->interruptInPipe = eWinUsbPipeInformation.PipeId;
}
else if (((eWinUsbPipeInformation.PipeType == UsbdPipeTypeInterrupt)
& this->isUsbEndpointDirectionOut(eWinUsbPipeInformation.PipeId)))
{
UtilityFunctions::displayTrace("initializeDevice : devInfo->InterruptOutPipe set");
devInfo->interruptOutPipe = eWinUsbPipeInformation.PipeId;
}
else
{
std::cout << "No settings for " << i << std::endl;
continue;
}
}
(devInfo - это пользовательский объект, содержащий WINUSB_INTERFACE_HANDLE
и PipeId
нужно было написать на устройстве)
Это печатает
initializeDevice : bNumEndpoints => 6
initializeDevice : devInfo->bulkOutPipe set
New Out Pipe = 1
initializeDevice : devInfo->bulkInPipe set
New In Pipe = 129
initializeDevice : devInfo->bulkOutPipe set
New Out Pipe = 2
initializeDevice : devInfo->bulkOutPipe set
New Out Pipe = 4
initializeDevice : devInfo->bulkInPipe set
New In Pipe = 134
initializeDevice : devInfo->bulkInPipe set
New In Pipe = 136
Но для последнего шага, который пишет:
UCHAR ucBuffer[] = "Hello world";
ULONG uiBytesToWrite = 11;
ULONG ulBytesWritten = 0;
if (devInfo->winUsbHandle == INVALID_HANDLE_VALUE)
{
return;
}
WinUsb_WritePipe(devInfo->winUsbHandle, devInfo->bulkOutPipe, ucBuffer, uiBytesToWrite, &ulBytesWritten, 0);//ERROR 87 : INVALID PARAMETER
Я пытался с каждым возможным PipeId (от 0 до 255, так как он на один байт), но все равно получает ту же ошибку. Документация MSDN WinUsb_WritePipe ничего не говорит об ошибке 87.