Я пытаюсь написать код для чтения из изохронного канала, используя LibUsbK в Win32. Я успешно инициализировал устройство в правильном состоянии для отправки и получения изохронных данных, и я вижу данные, отправляемые через USB, в моем аппаратном USB-анализаторе, но буферы, которые я получаю, всегда незаполнены, даже если анализатор показывает, что были данные в пакетах, отправленных на ПК.
Я новичок в LibUsbK и использую изохронные передачи, хотя я не новичок в USB в целом, но я действительно боролся с этим.
Код, который я использую для чтения с устройства, выглядит примерно так …
UsbK_SelectInterface(usbHandle,1,0);
UsbK_SetAltInterface(usbHandle,1,0,1);
IsoK_Init(&isoCtx, ISO_PACKETS_PER_XFER, 0);
IsoK_SetPackets(isoCtx, ISO_PACKET_SIZE); // Size of each individual packet
OvlK_Init(&ovlPool, usbHandle, 4, 0);
OvlK_ResetPipe(usbHandle, 0x83);
OclK_Acquire(&ovlkHandle, ovlPool);
UsbK_IsoReadPipe(usbHandle, 0x83, inBuffer, sizeof(inBuffer), ovlkHandle, isoCtx);
while(!finished)
{
if(OvlK_IsComplete(ovlkHandle)
{
fwrite(inBuffer, sizeof(inBuffer), 1, outFile);
memset(inBuffer,0xcc,sizeof(inBuffer));
OvlK_ReUse(ovlkHandle);
UsbK_IsoReadPipe(usbHandle, 0x83, inBuffer, sizeof(inBuffer), ovlkHandle, isoCtx);
{
}
Если я поставлю точку останова в строке fwrite, то inBuffer всегда будет заполнен 0xCC, то есть не заполнен чтением iso.
Я проверил все возвращаемые значения ошибок из вызовов функций UsbK / OvlK, и все они в порядке. Я проверил, что мои буферы достаточно велики, чтобы получать данные.
Я использую очень похожий код для записи в канал вывода ISO в конечной точке 0x02, и это прекрасно работает, единственное различие между приведенным выше кодом и моим кодом записи состоит в том, что команды fwrite / memset заменяются вызовом функции fillbuffer. который заполняет мой outBuffer перед вызовом функции UsbK_IsoWritePipe.
Я пытался просмотреть любые примеры, которые я мог найти в примерах, а также в Интернете, но изо всех сил пытался понять / заставить их работать с моим конкретным устройством.
Любые предложения или помощь с благодарностью.
Таким образом, похоже, что приведенный выше код работал, и меня вводило в заблуждение тот факт, что отладчик прерывал поток вещей — я постоянно забываю, что попытка отладить материал в реальном времени может создать свои собственные проблемы.
Первая проблема заключалась в том, что пошаговое выполнение кода в отладчике вызывало проблемы с низкоуровневым кодом libusbk, который захватывал usb-пакеты и правильно заполнял мои буферы — как только я позволил ему работать на полной скорости, и нашел другие способы тестирования буферов, которые я действительно нашел там были некоторые данные.
Вторая проблема, с которой я столкнулся, заключалась в том, что довольно часто буфер начинал заполняться только частично (и не всегда с самого начала), поэтому, когда я проверял данные, я печатал только первую часть буфера на консоль и т.д. все, что я видел, было 0xCC, и поэтому я предполагал, что это не сработало.
Как только я осознал, что в буфере на самом деле были некоторые данные, я просто начал просматривать буфер в чанках размером с пакет, если пакет полностью содержал 0xCC, я пропустил бы его и продолжил, но если какой-либо из них не был 0xCC, то Я бы относился к нему как к действительному пакету — это работало отлично, и я успешно получал все данные. Я уверен, что есть более «правильный» способ сделать это, но теперь он работает для меня.