HarmonyOS 鸿蒙Next中USBDDK通过OH_Usb_GetConfigDescriptor获取端点异常问题求助

HarmonyOS 鸿蒙Next中USBDDK通过OH_Usb_GetConfigDescriptor获取端点异常问题求助 1.在openharmony的api14版本中使用usbddk来连接打印机的usb驱动,但通过OH_Usb_GetConfigDescriptor获取端点时却只有一个端点,而用第三方库libusb的 libusb_get_config_descriptor却可以获取到正常的两个端点,想问下有没有大佬知道为啥,并且如何解决?

cke_4652.png

cke_5232.png

cke_6486.png

cke_7386.png


更多关于HarmonyOS 鸿蒙Next中USBDDK通过OH_Usb_GetConfigDescriptor获取端点异常问题求助的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

原因分析:

  1. USB描述符解析逻辑差异
    OpenHarmony的 OH_Usb_GetConfigDescriptor 在API14版本中,对复合设备或带额外描述符的设备存在解析限制,会遗漏部分端点;而 libusb 的解析逻辑更完整,能正确识别所有端点。

  2. 驱动层过滤或权限问题
    OpenHarmony的USB驱动框架在API14中可能对非标准设备的端点做了过滤,或者需要额外权限才能获取完整描述符。

  3. 描述符长度计算错误
    若设备的配置描述符 wTotalLength 字段计算不准确, OH_Usb_GetConfigDescriptor 会提前终止解析,导致只读取到一个端点。

解决方案:

  1. 手动解析完整配置描述符
    跳过 OH_Usb_GetConfigDescriptor ,直接通过 OH_Usb_ControlTransfer 发送 GET_CONFIG_DESCRIPTOR 请求,获取原始二进制数据后自行解析。
// 示例:手动获取并解析配置描述符
uint8_t buffer[4096];
int ret = OH_Usb_ControlTransfer(
    m_deviceId,
    USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
    USB_REQ_GET_CONFIG_DESCRIPTOR,
    0,  // wValue
    0,  // wIndex
    buffer,
    sizeof(buffer),
    1000 // 超时时间
);
if (ret > 0) {
    // 自行解析buffer中的端点描述符
    parseConfigDescriptor(buffer, ret);
}
  1. 升级到API15及以上版本
    OpenHarmony在API15中修复了USB描述符解析的相关问题,升级后 OH_Usb_GetConfigDescriptor 可以正常获取所有端点。

  2. 适配libusb(临时方案)
    如果无法升级系统,可以在应用中集成 libusb 替代原生 usbddk ,直接调用 libusb_get_config_descriptor 获取完整端点信息。

关键验证点:

检查设备的配置描述符原始二进制数据,确认 bNumEndpoints 是否为2。
对比 OH_Usb_GetConfigDescriptor 返回的描述符长度与实际设备的 wTotalLength 是否一致。
确认应用已申请 usbmanager 权限,且设备已被正确授权,

更多关于HarmonyOS 鸿蒙Next中USBDDK通过OH_Usb_GetConfigDescriptor获取端点异常问题求助的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


建议直接用libusb, 我就是用的 libusb;

这样的话,一些基于 libusb 的库也能直接使用了。

HarmonyOS的流畅动画和过渡效果让操作更加顺畅,体验极佳。

emm,领导让我用usbddk方式来实现…,

在HarmonyOS Next中,使用OH_Usb_GetConfigDescriptor获取配置描述符后,端点信息异常通常与描述符结构解析有关。请检查返回的UsbConfigDescriptor结构体,确认其endpoints数组是否有效。可能原因包括设备描述符不匹配或USB接口未正确枚举。建议直接验证rawDescriptor数据,并确保调用OH_Usb_ClaimInterface成功后再获取端点。

这个问题通常是由于OH_Usb_GetConfigDescriptor返回的配置描述符结构体解析方式与libusb存在差异导致的。USBDDK返回的UsbConfigDescriptor结构体中,端点描述符需要通过interface数组进一步获取,而不是直接从配置描述符的端点计数获取。

根据你提供的截图,OH_Usb_GetConfigDescriptor返回的UsbConfigDescriptor显示interfaceCount为1,interface[0]endpointCount为2。这说明两个端点信息实际上包含在接口描述符中,你需要通过遍历接口来获取端点描述符。

正确的端点获取步骤应该是:

  1. 使用OH_Usb_GetConfigDescriptor获取配置描述符
  2. 遍历config->interfaceCount个接口
  3. 对每个接口,遍历config->interface[i].endpointCount个端点
  4. 通过config->interface[i].endpoint[j]访问具体的端点描述符

而libusb的libusb_get_config_descriptor可能将端点描述符扁平化处理,直接通过配置描述符的端点计数来访问,导致两者表现不一致。

请检查你的代码是否按照上述方式正确解析了接口和端点描述符。如果问题仍然存在,建议确认设备描述符是否正常,并检查USBDDK的版本是否与API14兼容。

回到顶部