• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# USB串口通信管理
2
3<!--Kit: Basic Services Kit-->
4<!--Subsystem: USB-->
5<!--Owner: @hwymlgitcode-->
6<!--Designer: @w00373942-->
7<!--Tester: @dong-dongzhen-->
8<!--Adviser: @w_Machine_cc-->
9
10## 简介
11
12USB串口通信服务中通过Host设备的USB接口连接串口设备的串口进行串行数据传输,通信管理核心目标是实现设备间的高效、稳定数据传输与协同控制。主要使用在工业自动化与远程监控、物联网设备互联、医疗设备管理等场景。
13
14## 环境准备
15
16请参考USB串口通信服务开发概述[环境准备](usbSerial-overview.md#环境准备)。
17
18## 开发指导
19
20### 接口说明
21
22| 接口名                                                                          | 描述                       |
23|------------------------------------------------------------------------------|--------------------------|
24| getPortList(): Readonly&lt;SerialPort&gt;[]                                        | 获取串口设备列表。                |
25| hasSerialRight(portId: number): boolean                                      | 检查应用程序是否具有访问串口设备的权限。     |
26| requestSerialRight(portId: number): Promise&lt;boolean&gt;                         | 请求对串口设备的访问权限。            |
27| open(portId: number): void                                                   | 打开串口设备。                  |
28| close(portId: number): void                                                  | 关闭串口设备。                  |
29| read(portId: number, buffer: Uint8Array, timeout?: number): Promise&lt;number&gt;  | 从串口设备读取数据,使用Promise异步返回。 |
30| readSync(portId: number, buffer: Uint8Array, timeout?: number): number       | 以同步方法从串口设备读取数据。          |
31| write(portId: number, buffer: Uint8Array, timeout?: number): Promise&lt;number&gt; | 往串口设备写入数据,使用Promise异步返回。 |
32| writeSync(portId: number, buffer: Uint8Array, timeout?: number): number      | 以同步方法往串口设备写入数据。          |
33
34
35### 开发步骤
36
37开发者可以通过上述接口读取和写入数据:
38
39> **说明:**
40>
41> 以下示例代码只是串口数据传输的必要流程,需要放入具体的方法中执行。
42
431. 导入模块。
44
45    ```ts
46    // 导入serialManager模块。
47    import { serialManager } from '@kit.BasicServicesKit';
48    import { buffer } from '@kit.ArkTS';
49    ```
50
512. 获取设备列表。
52
53    ```ts
54    // 获取连接主设备的USB设备列表
55    let portList: serialManager.SerialPort[] = serialManager.getPortList();
56    console.info(`usbSerial portList: ${portList}`);
57    if (portList === undefined || portList.length === 0) {
58      console.error('usbSerial portList is empty');
59      return;
60    }
61    ```
62
633. 获取设备操作权限。
64
65    ```ts
66    // 此处对列表中的第一台USB设备判断是否拥有访问权限
67    // 函数名仅作为示例,实际需要与业务结合命名
68    async function serialDefault() {
69      let portId: number = portList[0].portId;
70      if (!serialManager.hasSerialRight(portId)) {
71        await serialManager.requestSerialRight(portId).then(result => {
72          if(!result) {
73            // 没有访问设备的权限且用户不授权则退出
74            console.error('The user does not have permission to perform this operation');
75            return;
76          }
77        });
78      }
79    }
80    ```
81
824. 根据串口打开设备。
83
84    ```ts
85    try {
86      serialManager.open(portId)
87      console.info(`open usbSerial success, portId: ${portId}`);
88    } catch (error) {
89      console.error(`open usbSerial error: ${error}`);
90    }
91    ```
92
935. 通过串口读取数据。
94
95    ```ts
96    // 异步读取
97    let readBuffer: Uint8Array = new Uint8Array(64);
98    serialManager.read(portId, readBuffer, 2000).then((size: number) => {
99      console.info(`read usbSerial success, readBuffer: ${readBuffer}`);
100    }).catch((error: Error) => {
101      console.error(`read usbSerial error: ${error}`);
102    })
103
104    // 同步读取
105    let readSyncBuffer: Uint8Array = new Uint8Array(64);
106    try {
107      serialManager.readSync(portId, readSyncBuffer, 2000);
108      console.info(`readSync usbSerial success, readSyncBuffer: ${readSyncBuffer}`);
109    } catch (error) {
110      console.error(`readSync usbSerial error: ${error}`);
111    }
112    ```
113
1146. 通过串口写入数据。
115
116    ```ts
117    // 异步写入
118    let writeBuffer: Uint8Array = new Uint8Array(buffer.from('Hello World', 'utf-8').buffer)
119    serialManager.write(portId, writeBuffer, 2000).then((size: number) => {
120      console.info(`write usbSerial success, writeBuffer: ${writeBuffer}`);
121    }).catch((error: Error) => {
122      console.error(`write usbSerial error: ${error}`);
123    })
124
125    // 同步写入
126    let writeSyncBuffer: Uint8Array = new Uint8Array(buffer.from('Hello World', 'utf-8').buffer)
127    try {
128      serialManager.writeSync(portId, writeSyncBuffer, 2000);
129      console.info(`writeSync usbSerial success, writeSyncBuffer: ${writeSyncBuffer}`);
130    } catch (error) {
131      console.error(`writeSync usbSerial error: ${error}`);
132    }
133    ```
134
1357. 关闭串口设备。
136
137    ```ts
138    try {
139      serialManager.close(portId);
140      console.info(`close usbSerial success, portId: ${portId}`);
141    } catch (error) {
142      console.error(`close usbSerial error: ${error}`);
143    }
144    ```
145
146### 调测验证
147
1481. 准备一根USB转串口线缆,线缆的USB接口连接到OpenHarmony设备USB端口(该端口需支持USB转串口),线缆的串口接口连接到目标设备的串口上。
1492. 在OpenHarmony设备上执行上述示例。
1503. 返回`usbSerial success`,表示相关接口调用成功,设备串口通信能力正常;返回`usbSerial error`,表示接口调用失败。