更新记录

1.2.1(2026-09-16)

  • 修复 HarmonyOS 严格类型编译失败的问题,兼容 ArkTS 对命名类型、错误回调、缓冲区和 UTF-8 编解码的检查。
  • 升级后无需修改现有串口配置或调用代码。
  • 本版本修改了 HarmonyOS 原生实现,需要重新制作并安装匹配的 HarmonyOS HAP 或自定义基座。

1.2.0(2026-09-12)

  • 新增 HarmonyOS 通过 USB OTG 识别和连接 CH340/CH341,支持设备扫描、系统授权、芯片初始化、常用串口参数、数据读写、持续读取、请求响应和断线资源清理。
  • 现有公开 API 和 Android 调用方式无需调整;HarmonyOS 使用 listPorts 获取设备后继续调用 openUsb
  • 本版本包含 HarmonyOS 原生串口能力,升级后需要重新制作并安装匹配的 HarmonyOS HAP 或自定义基座;是否完成真实通信仍需使用实际 CH340/CH341 设备验收。

1.1.0(2026-09-06)

  • 2026-09-06:调整 uni-app x Android 示例的函数声明顺序,修复查询、连接与发送示例的编译错误。

  • 新增 CH34x、CP210x、FTDI、PL2303、CDC ACM USB 转串口驱动,USB 模式现在会真实应用波特率、数据位、校验位、停止位和流控配置。

  • 首次打开 USB 设备时会主动请求 Android 系统访问授权;允许后自动继续连接,拒绝或超时返回明确错误。

  • 新增“串口连接与验收中心”,提供“没有设备,先体验”和“我已连接串口设备”两种入口,并按发现、授权、连接、发送、接收逐步引导。

  • USB 端口列表新增驱动名称、驱动支持状态、授权状态和端口数量,便于在页面中直接展示设备是否具备通信条件。

  • USB 读写、缓冲区清理和断线重连统一使用已匹配的芯片驱动;未知设备保留 Generic Bulk 兼容模式。

  • 修复 Android 从 uni-app 传入普通参数对象时能力查询、端口扫描等接口可能收到空参数的问题,现有调用代码无需调整。

  • 无设备自检改为依据能力查询和端口扫描的真实回调结果判定,不再把未成功执行的公开入口显示为通过。

  • 优化插件市场标题、能力描述与客户文档,按使用场景整理连接、发送、接收和运维示例,无需修改现有公开 API 调用。

  • 本次包含 Android 原生能力和依赖变化,升级后需要重新制作并安装 Android 自定义基座。

查看更多

平台兼容性

uni-app(5.07)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x(5.07)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × × ×

lizhao-serial-port

面向 uni-app / uni-app x Android 与 HarmonyOS 应用的专业串口通信插件:从 USB 设备发现、系统授权、芯片驱动到多会话收发与结果验收,提供一条清晰、可诊断、可落地的接入链路。

功能特色

  • 新手也能完成验收:内置“串口连接与验收中心”,先判断环境,再引导连接、授权、配置、发送、接收和导出结果。
  • 没有设备也知道下一步:选择“没有设备,先体验”可验证公开 API、Hex 与字节转换;依赖硬件的项目明确显示“等待设备”,不伪造通信成功。
  • 主流 USB 芯片直接接入:内置 CH34x、CP210x、FTDI、PL2303、CDC ACM 驱动,连接常见 USB 转串口线时无需业务层自己处理芯片初始化。
  • USB 授权闭环:首次打开 USB 设备时按平台申请系统访问授权,授权成功后继续建立会话,拒绝或超时均返回可定位错误。
  • 路径与 USB 双通道:Android 可连接设备节点和外部 USB 串口,HarmonyOS 通过 USB Host 连接外部 CH340/CH341 串口设备。
  • 三种发送方式:支持 ArrayBuffer、Hex、UTF-8 / ASCII 文本,协议指令可按业务习惯直接发送。
  • 三种接收方式:支持单次读取、持续监听,以及发送后等待指定 Hex / 文本响应。
  • 多设备互不干扰:通过独立 sessionId 同时管理多个串口,并分别记录状态、重连次数和收发字节数。
  • 异常恢复与诊断:提供有限自动重连、错误事件、会话快照、全局运行态和累计流量,现场问题更容易复现和说明。
  • 兼容旧调用:保留 openSerial / writeData / readData / closeSerial,已有项目可分阶段迁移。

适用场景

  • 工控平板、PDA、边缘网关连接 RS232、RS485、TTL 转换器。
  • Android 或 HarmonyOS 手机、平板通过 OTG 连接 CH340 / CH341;Android 另支持 CP210x、FTDI、PL2303、CDC ACM 设备。
  • 仪表、传感器、继电器、读卡器、控制板、打印控制器等自定义串口协议设备。
  • 设备持续上报、轮询查询、指令响应匹配、多个串口同时在线的业务。
  • 需要把“是否发现设备、是否授权、使用什么驱动、是否收到真实响应”清楚展示给实施人员的项目。

不适合以下场景:

  • iOS、Web 或小程序直接访问真实串口。
  • 只用普通 USB 数据线把电脑和手机相连,却没有 USB 转串口设备。电脑连接手机的数据线只用于调试,不是串口设备。
  • 需要插件直接实现 Modbus RTU、CRC 或某个厂商私有协议。插件负责可靠字节收发,业务协议可在上层组合。

支持平台

平台 是否支持 说明
uni-app App-Android 支持 Vue2 / Vue3,可使用路径串口与 USB 串口
uni-app x App-Android 支持 UVUE,对外 API 与 uni-app 保持一致
iOS 不支持 核心串口 API 返回明确的不支持错误
HarmonyOS 支持 uni-app / uni-app x,可通过 OTG 使用 CH340/CH341 USB 串口
Web 不支持 当前未接入 Web Serial
微信 / 支付宝小程序 不支持 平台没有通用串口访问能力

Android 最低系统版本为 5.0。Android 与 HarmonyOS 的真实 USB 串口能力需要包含本插件原生代码的匹配自定义基座、HAP 或正式安装包。

三步开始

第一步:先打开验收中心

导入插件后先运行随插件提供的“串口连接与验收中心”。首页只有两个明确入口:

  • 没有设备,先体验:适合暂时没有串口外设的情况。它会检查能力查询、端口扫描和数据转换,并把真实硬件项目标成“等待设备”。
  • 我已连接串口设备:适合 Android 或 HarmonyOS 手机已通过 OTG 连接 USB 转串口线;Android 也可连接设备节点。

如果目前只有手机和连接电脑的数据线,可先走无设备体验。要完成真实收发,还需要手机支持的 OTG 转接头和 CH340/CH341 USB 转串口设备;做自发自收测试时,可将转换器的 TX 与 RX 交叉连接。

第二步:从插件根目录导入

import * as SerialPort from '@/uni_modules/lizhao-serial-port'

先检查能力,再扫描端口:

SerialPort.getCapabilities({
  success(capabilities) {
    if (!capabilities.supported) {
      console.log('当前平台不支持真实串口', capabilities.restrictedReason)
      return
    }

    SerialPort.listPorts({
      includeBusy: true,
      success(res) {
        console.log('发现的串口', res.ports)
      },
      fail(err) {
        console.log('扫描串口失败', err)
      }
    })
  }
})

USB 端口会返回 driverNamedriverSupportedpermissionGrantedportCount,Android 与 HarmonyOS 页面都可以直接告诉使用者当前匹配了什么驱动、是否已授权。

第三步:连接并取得真实响应

下面示例从扫描结果中选择一个 USB 设备,首次连接时插件会按平台自动请求系统授权;HarmonyOS 的 CH340/CH341 也使用同一调用方式:

const sessionId = 'main-device'

function connectUsb(port) {
  SerialPort.openUsb({
    vendorId: port.vendorId,
    productId: port.productId,
    serialNumber: port.serialNumber,
    sessionId,
    lineConfig: {
      baudRate: 9600,
      dataBits: 8,
      parity: 'none',
      stopBits: 1,
      flowControl: 'none'
    },
    success(res) {
      console.log('连接成功,当前驱动', res.session.descriptor.driverName)
    },
    fail(err) {
      console.log('连接失败', err.errCode, err.details)
    }
  })
}

连接成功只代表端口已打开。建议至少完成一次“发送指令并收到设备响应”,再把业务状态显示为“真实通信通过”。

核心配置

串口线参数 lineConfig

参数 类型 必填 说明 默认值 可选参数
baudRate number 波特率 9600 设备支持的正整数
dataBits number 数据位 8 常见值 5 / 6 / 7 / 8
parity string 校验方式 none none / odd / even
stopBits number 停止位 1 1 / 1.5 / 2
flowControl string 流控方式 none none / rtscts / xonxoff

USB 芯片驱动会应用上述线参数。路径串口会保留配置快照,但设备节点最终采用的线参数仍取决于设备系统和节点驱动,接入板载串口前应与硬件系统方确认。

会话参数 config

参数 类型 必填 说明 默认值 可选参数
sessionId string 会话标识;顶层同名参数优先 自动生成 非空字符串
autoReconnect boolean 读写异常后是否有限自动重连 true true / false
reconnectIntervalMs number 两次重连的间隔 1500 正整数,单位毫秒
maxReconnectAttempts number 最大重连次数 10 0 或正整数
readChunkSize number 默认单次读取上限 512 正整数
readIntervalMs number 持续读取轮询间隔 80 正整数,单位毫秒
writeTimeoutMs number 默认写入超时 2000 正整数,单位毫秒
readTimeoutMs number 默认读取超时 2000 正整数,单位毫秒
heartbeatIntervalMs number 统计事件间隔 3000 大于 200 的整数
textEncoding string 默认文本编码 utf-8 utf-8 / ascii
matcherHex string 会话级响应匹配 Hex 空字符串 有效 Hex 片段

接入方式选择

使用场景 推荐方式 推荐 API 说明
第一次接触串口 内置引导界面 验收中心 先完成环境、授权、参数、收发检查
暂时没有串口设备 无设备体验 getCapabilities / listPorts / Hex 转换 硬件项保持“等待设备”
USB 转串口线 USB 驱动模式 listPorts + openUsb 自动匹配主流芯片并申请访问权
板载串口节点 路径模式 openPath 需要应用进程具备节点访问权限
偶尔读取一包 单次读取 readOnce 适合查询后读取或低频上报
持续主动上报 事件读取 on('data') + startRead 页面卸载时停止并解绑
一问一答协议 请求响应 sendAndWait 按 Hex 或文本匹配响应
多个设备同时在线 多会话 独立 sessionId 每个设备独立状态和统计
自定义业务界面 纯 API 全部公开 API 不依赖内置验收中心

分类实战示例

连接类:路径串口与 USB 串口

// 板载设备节点。
SerialPort.openPath({
  path: '/dev/ttyS3',
  sessionId: 'board-uart',
  lineConfig: { baudRate: 115200 }
})

// USB 转串口设备。vendorId/productId 应取自 listPorts 返回值。
SerialPort.openUsb({
  vendorId: 0x1A86,
  productId: 0x7523,
  sessionId: 'usb-uart',
  lineConfig: { baudRate: 9600 }
})

发送类:文本、Hex 与二进制

// 文本设备,例如 AT 指令或带换行的命令。
SerialPort.writeText({
  sessionId: 'usb-uart',
  text: 'STATUS\r\n',
  encoding: 'ascii'
})

// 协议文档直接给出十六进制帧时使用。
SerialPort.writeHex({
  sessionId: 'usb-uart',
  hex: '010300000002C40B'
})

// 已在业务层组装好原始字节时使用。
const buffer = new ArrayBuffer(3)
const bytes = new Uint8Array(buffer)
bytes[0] = 0xAA
bytes[1] = 0x55
bytes[2] = 0x01
SerialPort.writeBytes({ sessionId: 'usb-uart', data: buffer })

接收类:单次、持续与请求响应

// 读取一包。
SerialPort.readOnce({
  sessionId: 'usb-uart',
  timeoutMs: 1500,
  success(res) {
    console.log('收到 Hex', res.hex)
  }
})

// 持续接收设备主动上报。
const onData = (event) => {
  console.log('持续数据', event.payload.hex)
}
SerialPort.on('data', onData)
SerialPort.startRead({ sessionId: 'usb-uart' })

// 发送后等待符合条件的响应。
SerialPort.sendAndWait({
  sessionId: 'usb-uart',
  hex: '010300000002C40B',
  matchHex: '010304',
  timeoutMs: 2000,
  success(res) {
    console.log('匹配成功', res.hex)
  }
})

// 页面卸载时使用同一个回调引用解绑。
SerialPort.stopRead({ sessionId: 'usb-uart' })
SerialPort.off('data', onData)

同一个会话不建议同时运行 startReadreadOnce / sendAndWait,否则多个读取者可能竞争同一批字节。

运维类:清空、状态与统一释放

// 开始新一轮测试前清理旧数据。
SerialPort.flush({ sessionId: 'usb-uart' })

// 查看一个会话。
SerialPort.getSessionState({
  sessionId: 'usb-uart',
  success(res) {
    console.log('连接状态与收发统计', res.session)
  }
})

// 查看全部会话和累计收发字节。
SerialPort.getRuntimeState({
  success(res) {
    console.log('运行态', res)
  }
})

// 应用退出串口业务时统一释放。
SerialPort.closeAllSessions({})

API 参考

API 一览

分类 API 用途
能力与发现 getCapabilities 查询平台、USB 授权、芯片驱动等能力
能力与发现 listPorts 列出路径与 USB 端口
连接 openPath 打开 /dev/tty* 设备节点
连接 openUsb 打开 USB 串口并按需申请授权
连接 closeSession 关闭指定会话
连接 closeAllSessions 关闭全部会话
发送 writeBytes 写入 ArrayBuffer
发送 writeHex 写入 Hex 字符串
发送 writeText 写入 UTF-8 / ASCII 文本
接收 readOnce 单次读取
接收 startRead 启动持续读取
接收 stopRead 停止持续读取
请求响应 sendAndWait 发送并等待匹配响应
维护 flush 清理收发缓冲区
状态 getSessionState 查询指定会话状态
状态 getRuntimeState 查询全部运行态
事件 on / off 订阅与取消事件
转换 hexStrToByteArr Hex 转 ArrayBuffer
转换 byteArrToHexStr ArrayBuffer 转 Hex
兼容 openSerial 兼容旧版打开调用
兼容 writeData 兼容旧版写入调用
兼容 readData 兼容旧版读取调用
兼容 closeSerial 兼容旧版关闭调用

公共回调

所有异步 API 均支持以下回调:

参数 类型 必填 说明 默认值 可选参数
success Function 操作成功时触发
fail Function 操作失败时触发,参数为结构化错误
complete Function 成功或失败后都会触发

连接参数

参数 类型 必填 说明 默认值 可选参数
openPath.path string Android 设备节点路径 /dev/tty*
openUsb.vendorId number USB 厂商 ID 取自 listPorts
openUsb.productId number USB 产品 ID 取自 listPorts
openUsb.serialNumber string 同 VID/PID 多设备时进一步定位 取自 listPorts
sessionId string 自定义会话 ID 自动生成 非空字符串
lineConfig object 串口线参数 默认线参数 见“核心配置”
config object 重连、超时和读取配置 默认会话参数 见“核心配置”

收发参数

参数 类型 必填 说明 默认值 可选参数
sessionId string 已打开的会话 ID 非空字符串
data ArrayBuffer 按 API 原始二进制数据
hex string 按 API 偶数长度 Hex 字符串 00FF 组成的字节序列
text string 按 API 文本数据 任意字符串
encoding string 文本编码 utf-8 utf-8 / ascii
timeoutMs number 本次操作超时 取会话配置 正整数
maxBytes number 本次最大读取字节数 取会话配置 正整数
intervalMs number 持续读取间隔 80 正整数,单位毫秒
matchHex string sendAndWait 的 Hex 匹配条件 有效 Hex 片段
matchText string sendAndWait 的文本匹配条件 任意非空文本

关键返回字段

字段 类型 说明
ports Array listPorts 返回的端口列表
driverName string USB 设备匹配的驱动名称
driverSupported boolean 是否匹配内置串口驱动
permissionGranted boolean 当前应用是否已获 USB 设备访问权
portCount number USB 设备提供的串口数量
session object 当前会话状态快照
data ArrayBuffer 原始接收数据
hex string 接收数据的 Hex 表示
written number 实际写入字节数
txBytes / rxBytes number 会话累计发送 / 接收字节数
txBytesTotal / rxBytesTotal number 插件运行期间的全局累计字节数

事件

事件名 触发时机 payload 主要字段
open 会话打开成功 session
close 会话关闭 sessionId / reason
data 持续读取收到数据 sessionId / data / hex / length
error 会话发生读写或重连错误 sessionId / error
reconnect 开始一次自动重连 sessionId / attempt / maxAttempts / delayMs
stats 心跳统计更新 会话与全局收发字节数
const onError = (event) => {
  console.log('串口异常', event.sessionId, event.payload)
}

SerialPort.on('error', onError)

// 不再使用时必须传入原函数引用。
SerialPort.off('error', onError)

错误码

错误码 含义 说明
9015001 平台不支持 当前平台没有真实串口实现
9015002 参数无效 缺少必填参数或参数格式错误
9015003 会话不存在 sessionId 未打开或已关闭
9015004 端口已打开 会话 ID 重复或端口正在使用
9015005 USB 访问未获允许 使用者拒绝授权或授权等待超时,可重新连接后再次允许
9015006 打开失败 设备、驱动、接口或系统访问异常
9015007 写入失败 连接断开、超时或设备拒绝写入
9015008 读取失败 连接断开或底层读取异常
9015009 操作超时 未在限定时间内读到或匹配响应
9015010 串口断开 会话已失去连接
9015011 未找到端口 设备已拔出或识别条件不匹配
9015012 重连失败 已达到最大重连次数
9015013 清空失败 无法清理当前缓冲区
9015014 系统错误 其他系统级异常

常见问题

只有手机和电脑数据线,能测试真实串口吗?

不能。普通数据线建立的是调试连接,不会在手机端生成可供本插件通信的 USB 串口。可先使用“没有设备,先体验”;真实测试至少需要 OTG 转接头与 CH340/CH341 USB 转串口设备,或一台提供串口设备节点的 Android 工控设备。

为什么能看到 USB 设备,打开后仍然不能通信?

先查看 driverName / driverSupported / permissionGranted,再确认波特率、数据位、校验位、停止位和流控与外设一致。未知芯片可能进入 Generic Bulk 降级模式,但“存在 Bulk Endpoint”不代表设备一定遵循通用串口协议。

第一次打开为什么出现系统弹窗?

这是 Android 或 HarmonyOS 对目标 USB 设备的访问授权,不是普通运行时权限。允许访问目标设备后插件会继续连接;拒绝或等待超时会返回 9015005

为什么发送成功却不能显示“真实通信通过”?

写入成功只代表数据已交给串口驱动。只有读取到外设返回的数据,或 sendAndWait 匹配到预期响应,才能证明双方参数和协议都正确。

为什么路径串口提示没有权限?

/dev/tty* 的访问权限由 Android 设备系统、固件和节点权限控制。普通消费级手机通常不能直接访问任意节点;工控设备需由系统厂商提供可访问的节点或对应系统授权。

更新插件后需要重新制作 Android 自定义基座或 HarmonyOS HAP 吗?

如果只修改页面、样式或业务调用,重新运行资源即可。升级后若包含本插件 Android 原生能力或 HarmonyOS USB 芯片驱动变化,需要重新制作并安装对应平台的自定义基座、HAP 或正式包;旧包不会自动获得新的原生能力。

如何避免页面退出后仍在读取?

页面卸载时依次执行 stopReadcloseSession,并使用注册时保存的同一个函数引用调用 off。应用需要一次释放全部设备时可调用 closeAllSessions

注意事项

  • 不要把扫描到设备、授权成功或写入成功当作业务通信成功;以真实响应为最终依据。
  • Hex 字符串必须由有效十六进制字符组成并保持偶数长度。
  • 协议分帧、CRC、Modbus RTU 和厂商命令由业务层实现,插件负责字节级通信与会话管理。
  • 修改 Android 或 HarmonyOS 原生能力、依赖或授权流程后,必须重新制作并安装匹配平台的自定义基座、HAP 或正式包。
  • 真实设备兼容性受手机 OTG 能力、USB 转串口芯片、供电、系统版本、线序和外设协议共同影响,建议先在验收中心完成完整闭环;HarmonyOS 当前以 CH340/CH341 为支持范围。

作者系列 UTS 插件

以下为已在 DCloud 插件市场上架的作者系列 UTS 插件,可按业务场景组合使用。未列出的插件表示当前未确认公开市场页,后续上架后再补充。

插件 能力方向 插件市场
lizhao-nfc-pro NFC 标签读写、NDEF、IsoDep 与诊断 查看插件
lizhao-float-window 悬浮窗、画中画、权限与诊断 查看插件
lizhao-device-id 设备标识、隐私策略与诊断 查看插件
lizhao-scan-pro 原生扫码、连续扫码、相册识别 查看插件
lizhao-choose-file 原生文件选择、上传、进度与取消 查看插件
lizhao-bg-audio 背景音频播放、队列、倍速与事件 查看插件
lizhao-smart-tts 系统 TTS、云端合成、听书方案 查看插件
lizhao-share-plus 系统分享、远程文件下载后分享 查看插件
lizhao-sqlite-pro 原生 SQLite、迁移、备份与诊断 查看插件
lizhao-icon-pro SVG 图标组件、多主题与缓存 查看插件
lizhao-cast-screen DLNA 投屏、AirPlay 路由入口 查看插件
lizhao-call-kit 电话、短信、通讯录原生能力 查看插件
lizhao-app-keepalive 应用保活、唤醒、自愈与报告 查看插件
lizhao-doc-corrector 文档扫描、矫正、增强与识别 查看插件
lizhao-emu-detect 模拟器环境检测、风险评分与证据 查看插件
lizhao-gallery-pro 相册媒体分页、筛选、缩略图与导出 查看插件
lizhao-video-thumb 视频封面、批量取帧与 Base64 返回 查看插件
lizhao-ble BLE 扫描、连接、读写、通知与自动重连 查看插件
lizhao-sse-pro SSE、Line、JSONL 与 Raw 流式请求 查看插件
lizhao-pdf-pro PDF 阅读、签批、真实写回与页面处理 查看插件
lizhao-serial-port 路径串口、USB 串口、多会话收发与诊断 查看插件
lizhao-wechat-kit 微信登录、分享、支付、小程序与客服 查看插件
lizhao-video-editor 视频裁剪、压缩、取帧与 FFmpeg/FFprobe 查看插件
lizhao-vpn-pro 企业 VPN、IKEv2、安全接入与脱敏诊断 查看插件

隐私、权限声明

1. 本插件需要申请的系统权限列表:

Android 路径串口需要设备节点访问权限;Android 与 HarmonyOS 的 USB 串口需要 USB Host 能力和目标 USB 设备访问授权

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集、不存储、不上传串口数据;业务发送与接收的数据仅在应用进程内按调用参数处理

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率: