实现USB数据通信鸿蒙示例代码

本文原创发布在华为开发者社区,更多鸿蒙场景化示例请见华为开发者联盟官网"行业实践与常见问题"专题页。

介绍

本示例使用@ohos.usbManager模块实现usb设备数据通信功能,主要实现控制传输功能与批量传输功能。

实现USB数据通信源码链接

效果预览

实现思路

  1. 获取连接设备信息。
kotlin 复制代码
    // 获取 usb 连接设备
    this.devicesList = usbManager.getDevices();
    if (this.devicesList.length !== 0) {
      // 获取临时权限
      usbManager.requestRight(this.devicesList[0].name);
      // 连接设备
      let devicePipe: usbManager.USBDevicePipe = usbManager.connectDevice(this.devicesList[0]);
      // 更新连接状态
      this.usbConnectStatus =
        this.context.resourceManager.getStringSync($r('app.string.UsbConnectConnectStatus_Connected'));
      // 获取设备列表第一台设备信息
      this.deviceName = this.devicesList[0].name;
      this.busNum = this.devicesList[0].busNum;
      this.devAddress = this.devicesList[0].devAddress;
    } else {
      this.usbConnectStatus =
        this.context.resourceManager.getStringSync($r('app.string.UsbConnectConnectStatus_Disconnected'));
      this.tipsMassage = this.context.resourceManager.getStringSync($r('app.string.ConnectFailed'));
    }
  1. 实现控制传输功能。
typescript 复制代码
    private async controlTransfer(device: usbManager.USBDevice) {
    try {
    // 调用 UsbService.controlTransfer() 方法进行控制传输
    // controlTransferParam bmRequestType 属性 0x00:写数据,主设备往从设备;0x80:读数据,从设备往主设备.
    this.controlTransferResult = await UsbService.controlTransfer(device, controlTransferParam);
    if (this.controlTransferResult === -1) {
      this.tipsMassage = this.context.resourceManager.getStringSync($r('app.string.ControlTransfer_Failed'));
    }
    } catch (err) {
    this.tipsMassage =
      `${this.context.resourceManager.getStringSync($r('app.string.ControlTransfer_Error'))}: ${err}`;
    }
    }
  1. 实现批量传输 OUT。
typescript 复制代码
    private async bulkTransferOut(device: usbManager.USBDevice, sendText: string) {
    // 将 string 转换为 Uint8Array 类型
    let transData: Uint8Array = TypeTransUtil.stringToUint8Array(sendText);
    try {
    // 发送数据 OUT
    this.bulkOutResult =
      await UsbService.bulkTransferOut(device, transData);
    if (this.bulkOutResult === -1) {
      this.tipsMassage = this.context.resourceManager.getStringSync($r('app.string.BulkTransferOut_Failed'));
    }
    } catch (err) {
    this.tipsMassage =
      `${this.context.resourceManager.getStringSync($r('app.string.BulkTransferOut_Error'))}: ${err}`;
    }
    }
  1. 实现批量传输 IN。
ini 复制代码
    private async bulkTransferIn(device: usbManager.USBDevice) {
    // 接收批量传输返回值 与 buffer 获取的数据
    let receiveData: ReceiveData = new ReceiveData(0, '');
    
    try {
      // 接收数据 IN
      receiveData = await UsbService.bulkTransferIn(device);
      this.receiveMassage = receiveData.receiveMassage;
      this.bulkInResult = receiveData.receiveStatus;
      if (receiveData.receiveStatus === -1) {
        this.tipsMassage = this.context.resourceManager.getStringSync($r('app.string.BulkTransferIn_Failed'));
      }
    } catch (err) {
      this.tipsMassage = `${this.context.resourceManager.getStringSync($r('app.string.BulkTransferIn_Error'))}: ${err}`;
    }
    }
相关推荐
@PHARAOH25 分钟前
WHAT - cursor cli 开发范式
前端·ai·ai编程
子兮曰1 小时前
深入 HTML-in-Canvas:当 Canvas 学会了渲染 DOM,前端图形生态要变天了
前端·javascript·canvas
ws_qy1 小时前
从大模型原理到前端 AI Coding 工程化实践
前端·ai编程
倾颜2 小时前
React 19 源码主线拆解 04:Fiber 到底是什么,React 为什么需要 Fiber?
前端·react.js·源码阅读
AI攻城狮2 小时前
国产大模型能力大比拼,社区有话说
前端
IT_陈寒2 小时前
Vite的public文件夹放静态资源?这坑我替你踩了
前端·人工智能·后端
涵涵(互关)3 小时前
GoView各项目文件中的相关语法2
前端·javascript·vue.js
子兮曰3 小时前
别让爬虫白嫖你的导航站了:纯免费,手把手实现加密字体防爬
前端·javascript·后端
小村儿3 小时前
连载06 - Hooks 源码深度解析:Claude Code 的确定性自动化体系
前端·后端·ai编程
心中无石马3 小时前
uniapp引入tailwindcss4.x
前端·css·uni-app