鸿蒙0基础学习【USB中断传输】USB开发服务
·
场景介绍
中断传输主要用于主机(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接口进行数据传输。以下步骤描述了如何使用中断传输方式来传输数据:
说明
以下示例代码只是使用中断传输方式来传输数据的必要流程,需要放入具体的方法中执行。在实际调用时,设备开发者需要遵循设备相关协议进行调用,确保数据的正确传输和设备的兼容性。
- 导入模块。
// 导入usbManager模块。
import { usbManager } from '@kit.BasicServicesKit';
- 获取设备列表。
// 获取连接主设备的USB设备列表
let usbDevices: Array<usbManager.USBDevice> = usbManager.getDevices();
console.info(`usbDevices: ${usbDevices}`);
if(usbDevices.length === 0) {
console.error('usbDevices is empty');
return;
}
- 获取设备操作权限。
// 此处对列表中的第一台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;
}
});
}
- 获取通过中断传输读取数据的端点。
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;
}
- 连接设备,注册通信接口。
// 注册通信接口,注册成功返回0,注册失败返回其他错误码。
let claimInterfaceResult: number = usbManager.claimInterface(devicePipe, usbInterface, true);
if (claimInterfaceResult !== 0) {
console.error(`claimInterface error = ${claimInterfaceResult}`)
return;
}
- 传输数据。
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}`);
}
- 取消传输,释放接口,关闭设备消息控制通道。
usbManager.usbCancelTransfer(transferParams);
usbManager.releaseInterface(devicePipe, usbInterface);
usbManager.closePipe(devicePipe);
调测验证
- 主机端通过USB接口连接支持中断传输的终端设备(鼠标、键盘等)。
- 执行上述代码。
- log中搜索关键字transfer success,表示中断传输接口调用成功。
更多推荐


所有评论(0)