实现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}`;
    }
    }
相关推荐
工一木子26 分钟前
URL时间戳参数深度解析:缓存破坏与前端优化的前世今生
前端·缓存
半点寒12W2 小时前
微信小程序实现路由拦截的方法
前端
某公司摸鱼前端3 小时前
uniapp socket 封装 (可拿去直接用)
前端·javascript·websocket·uni-app
要加油哦~3 小时前
vue | 插件 | 移动文件的插件 —— move-file-cli 插件 的安装与使用
前端·javascript·vue.js
小林学习编程3 小时前
Springboot + vue + uni-app小程序web端全套家具商场
前端·vue.js·spring boot
柳鲲鹏3 小时前
WINDOWS最快布署WEB服务器:apache2
服务器·前端·windows
weixin-a153003083164 小时前
【playwright篇】教程(十七)[html元素知识]
java·前端·html
ai小鬼头4 小时前
AIStarter最新版怎么卸载AI项目?一键删除操作指南(附路径设置技巧)
前端·后端·github
一只叫煤球的猫5 小时前
普通程序员,从开发到管理岗,为什么我越升职越痛苦?
前端·后端·全栈
vvilkim5 小时前
Electron 自动更新机制详解:实现无缝应用升级
前端·javascript·electron