场景介绍

中断传输主要用于主机(Host)接收设备(Device)发送的数据包。设备的端点模式决定了接口支持中断读或中断写,这种传输方式适用于少量的、分散的、不可预测的数据类型的传输,鼠标、键盘和操纵杆等设备均属于这种类型,且此类设备的端点一般只支持中断读操作。

环境准备

环境要求

  • 开发工具及配置:

    DevEco Studio作为驱动开发工具,是进行驱动开发必备条件之一,开发者可以使用该工具进行开发、调试、打包等操作。请[下载安装]该工具,并参考[DevEco Studio使用指南]中的[创建工程及运行]进行基本的操作验证,保证DevEco Studio可正常运行。

  • SDK版本配置:

    扩展外设管理提供的ArkTs接口,所需SDK版本为API16及以上才可使用。

  • HDC配置:

    HDC(HarmonyOS Device Connector)是为开发人员提供的用于调试的命令行工具,通过该工具可以在Windows/Linux/Mac系统上与真实设备或者模拟器进行交互

搭建环境

  • 在PC上安装[DevEco Studio],要求版本在4.1及以上。
  • 将public-SDK更新到API 16或以上。
  • PC安装HDC工具,通过该工具可以在Windows/Linux/Mac系统上与真实设备或者模拟器进行交互。
  • 用USB线缆将搭载HarmonyOS的设备连接到PC。

开发指导

接口说明

接口名 描述
usbSubmitTransfer(transfer: UsbDataTransferParams): void 异步传输接口(支持实时、批量、中断传输)。
usbCancelTransfer(transfer: UsbDataTransferParams): void 取消已提交的异步传输。

开发步骤

主机(Host)连接设备(Device),通过usbSubmitTransfer接口进行数据传输。以下步骤描述了如何使用中断传输方式来传输数据:

说明

以下示例代码只是使用中断传输方式来传输数据的必要流程,需要放入具体的方法中执行。在实际调用时,设备开发者需要遵循设备相关协议进行调用,确保数据的正确传输和设备的兼容性。

  1. 导入模块。
// 导入usbManager模块。
import { usbManager } from '@kit.BasicServicesKit';
  1. 获取设备列表。
// 获取连接主设备的USB设备列表
let usbDevices: Array<usbManager.USBDevice> = usbManager.getDevices();
console.info(`usbDevices: ${usbDevices}`);
if(usbDevices.length === 0) {
  console.error('usbDevices is empty');
  return;
}
  1. 获取设备操作权限。
// 此处对列表中的第一台USB设备判断是否拥有访问权限
let usbDevice: usbManager.USBDevice = usbDevices[0];
if(!usbManager.hasRight(usbDevice.name)) {
  await usbManager.requestRight(usbDevice.name).then(result => {
    if(!result) {
      // 没有访问设备的权限且用户不授权则退出
      console.error('The user does not have permission to perform this operation');
      return;
    }
  });
}
  1. 获取通过中断传输读取数据的端点。
let devicePipe: usbManager.USBDevicePipe = usbManager.connectDevice(usbDevice);
let usbConfigs: usbManager.USBConfiguration[] = usbDevice.configs;
let usbInterfaces: usbManager.USBInterface[] = [];
let usbInterface: usbManager.USBInterface | undefined = undefined
let usbEndpoints: usbManager.USBEndpoint[] = [];
let usbEndpoint: usbManager.USBEndpoint | undefined = undefined
for (let i = 0; i < usbConfigs.length; i++) {
  usbInterfaces = usbConfigs[i].interfaces;
  for (let i = 0; i < usbInterfaces.length; i++) {
    usbEndpoints = usbInterfaces[i].endpoints;
    usbEndpoint = usbEndpoints.find((value) => {
      return value.direction === 128 && value.type === usbManager.UsbEndpointTransferType.TRANSFER_TYPE_INTERRUPT;
    })
    if (usbEndpoint !== undefined) {
      usbInterface = usbInterfaces[i];
      break;
    }
  }
}
if (usbEndpoint === undefined) {
  console.error(`get usbEndpoint error`)
  return;
}
  1. 连接设备,注册通信接口。
// 注册通信接口,注册成功返回0,注册失败返回其他错误码。
let claimInterfaceResult: number = usbManager.claimInterface(devicePipe, usbInterface, true);
if (claimInterfaceResult !== 0) {
  console.error(`claimInterface error = ${claimInterfaceResult}`)
  return;
}
  1. 传输数据。
try {
  // 通信接口注册成功,传输数据
  let transferParams: usbManager.UsbDataTransferParams = {
    devPipe: devicePipe,
    flags: usbManager.UsbTransferFlags.USB_TRANSFER_SHORT_NOT_OK,
    endpoint: usbEndpoint.address,
    type: usbManager.UsbEndpointTransferType.TRANSFER_TYPE_INTERRUPT,
    timeout: 2000,
    length: 10,
    callback: () => {},
    userData: new Uint8Array(10),
    buffer: new Uint8Array(10),
    isoPacketCount: 2,
  };


  transferParams.callback = (err: Error, callBackData: usbManager.SubmitTransferCallback) => {
    console.info(`callBackData = ${callBackData}`);
    console.info(`transfer success,result = ${transferParams.buffer}`);
  }
  usbManager.usbSubmitTransfer(transferParams);
  console.info('USB transfer request submitted.');
} catch (error) {
  console.error(`USB transfer failed: ${error}`);
}
  1. 取消传输,释放接口,关闭设备消息控制通道。
usbManager.usbCancelTransfer(transferParams);
usbManager.releaseInterface(devicePipe, usbInterface);
usbManager.closePipe(devicePipe);

调测验证

  1. 主机端通过USB接口连接支持中断传输的终端设备(鼠标、键盘等)。
  2. 执行上述代码。
  3. log中搜索关键字transfer success,表示中断传输接口调用成功。
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐