欢迎加入开源鸿蒙 PC 社区:https://harmonypc.csdn.net/

欢迎在 PC 社区平台申请新建项目:https://atomgit.com/OpenHarmonyPCDeveloper

适配开源地址:https://atomgit.com/xiaohong-ai/sscom

一、为什么要适配 SSCom

串口调试工具属于开发现场里使用频率很高、但又很容易被低估的一类软件。调试单片机、模组、网关、开发板或产线测试脚本时,开发者通常需要反复完成串口枚举、参数配置、文本/HEX 收发、编码切换、DTR/RTS 控制和日志保存。传统桌面串口工具在 Windows、Linux、macOS 上已经非常成熟,但鸿蒙 PC 进入开发桌面场景后,也需要一款符合本地窗口、权限、文件访问和设备模型的串口调试助手。

sscom 项目本身已经完成了跨平台方向的重构:桌面端采用 Rust + egui,串口层使用 serialport crate;鸿蒙端则拆成 ArkUI 界面、C++ NAPI 桥接层和 Rust FFI 核心库。这样的结构适合继续做鸿蒙 PC 适配,因为 UI、串口核心和编码转换可以分层维护,不需要把一整套桌面窗口代码硬搬到 HAP 工程里。

本次真机验证的鸿蒙 PC 应用 BundleName 为 com.sscom.serial,应用版本为 1.0.0,Compile SDK 为 HarmonyOS 6.0.2.130,Target API 为 60001021,目标 ABI 为 arm64-v8a。测试设备通过 hdc 连接,系统截图分辨率为 3120×2080。以下图片均为鸿蒙 PC 真机运行截图。

二、适配边界先明确

串口调试助手看起来只是几个输入框和按钮,但真正适配到鸿蒙 PC 时,重点不在界面复刻,而在通信链路和系统边界的重建。桌面端可以依赖 serialport 库统一处理不同系统的串口细节,鸿蒙端则需要面对 HAP 生命周期、USB 串口权限、Native 库装载、ArkTS 与 Rust 之间的数据交换,以及窗口化 PC 体验。

模块桌面端常见处理鸿蒙 PC 侧处理
串口枚举serialport crate 直接枚举Rust FFI 扫描设备节点并通过 NAPI 返回 ArkTS
串口打开原生二进制直接访问 COM 或 /dev/tty*HAP 权限、设备节点、Native 句柄共同约束
数据收发Rust 线程读写串口ArkTS 轮询调用 NAPI,底层 Rust 负责读写
HEX 支持UI 状态和 Rust 解析在同进程内完成ArkTS 管理模式,Rust 负责字节转换与校验
编码转换UTF-8/GBK/Latin1 由桌面端处理通过 Rust 核心库复用 encoding_rs 能力
文件能力系统文件对话框使用鸿蒙文件选择器读取发送内容、保存接收内容
控制线DTR/RTS 由串口库封装通过 ioctl 暴露给 ArkTS 开关

这次适配没有把串口助手做成“命令行外壳”,而是把串口参数、收发面板、HEX/编码状态、文件操作和底部状态栏放进同一个原生应用窗口里。这样更接近 PC 上日常调试的习惯:先确认连接,再决定收发格式,最后查看日志和统计。

三、真机运行与核心功能

在进入截图说明前,先放一段真机运行录屏,便于直接观察应用在鸿蒙 PC 桌面环境中的启动、窗口展示和核心交互状态。

1. 主界面:串口参数和收发区域同屏呈现

应用启动后,左侧是连接参数与数据格式,右侧是接收日志和发送区,顶部保留当前连接状态和打开串口入口。这个布局适合串口调试的高频操作:波特率、数据位、校验位、停止位、流控、HEX 显示、HEX 发送、编码选择都能在同一屏完成确认。

在这里插入图片描述

截图中当前未接入 USB 串口设备,底部状态栏提示“未检测到串口”。这类空态对串口工具很重要,因为真实现场经常先遇到的不是收发成功,而是数据线未连接、设备未授权、串口被占用或设备节点尚未生成。应用没有在空设备状态下崩溃,而是把状态稳定地留在页面底部。

2. 波特率选择:常用档位固定呈现

波特率是串口通信最容易配错的参数之一。鸿蒙 PC 版本将常用档位做成下拉选择,从 3002000000 都可以直接选择,默认保持在常见的 115200

在这里插入图片描述

这里没有让用户手动输入任意数字,是为了减少现场调试时的低级错误。多数开发板、模组和调试固件都使用固定波特率档位,下拉列表比自由输入更适合桌面工具的默认路径;确有特殊波特率时,再在核心层补充支持会更可控。

3. HEX 收发:把字节视图和发送格式同时联动

切换 HEX 显示HEX 发送 后,接收日志标题旁会出现 HEX 标记,发送区也会切换为按空格分隔字节的输入提示。这个联动避免了“接收按文本看、发送按 HEX 发”时状态不清的问题。

在这里插入图片描述

HEX 模式是串口调试的核心能力。调试二进制协议、bootloader 握手、寄存器读写或带校验帧的数据包时,文本窗口不足以判断真实字节。适配时将 HEX 状态同时体现在接收区和发送区,让用户一眼能确认当前窗口正在以字节方式工作。

4. 编码选择:兼顾 UTF-8、GBK 和 Latin1

串口设备并不总是按 UTF-8 输出日志。很多存量设备、工控模块和中文固件仍然使用 GBK,部分协议还会混合 Latin1 或直接输出原始字节。鸿蒙 PC 版本保留了接收编码和发送编码选择,其中接收侧支持 UTF-8、GBK、Latin1。

在这里插入图片描述

编码能力放在串口工具里,比在日志输出后再做外部转换更实用。Rust 核心库复用 encoding_rs 做转换,ArkTS 侧只负责模式状态和文本展示;这样既避免了 UI 层堆积复杂字节逻辑,也能降低多字节字符截断带来的乱码风险。

5. 执行前拦截:未选择串口时阻止打开

在没有可用串口时点击“打开串口”,应用会弹出提示,要求先连接开发板并刷新扫描结果。这不是一个装饰性弹窗,而是串口工具必须具备的安全路径。

在这里插入图片描述

串口调试现场经常会反复插拔设备。与其让底层直接尝试打开空路径,再把错误埋进日志里,不如在 UI 层先完成必要校验。等接入真实 USB 转串口后,用户只需要刷新串口列表、选择设备、确认波特率,再打开连接即可。

四、适配中的主要困难

难点一:桌面串口库不能直接照搬到鸿蒙端

桌面端 Rust 可以使用 serialport crate 统一处理平台差异,但鸿蒙目标并不适合原样依赖这条路径。当前鸿蒙核心库改为 staticlib,底层通过 libctermiosioctl 处理串口打开、参数配置、读写以及 DTR/RTS 控制。这样做让串口访问更贴近系统能力,但也意味着波特率映射、数据位、校验位、停止位、流控和错误返回都需要自己兜住。

难点二:ArkTS 与 Rust 之间必须控制好数据边界

鸿蒙端的调用链路是 Index.etsSerialPort.etslibsscom_napi.sobridge.cpplibsscom_core.a。ArkTS 适合管理界面状态和用户交互,Rust 适合处理字节、编码和串口读写;中间的 C++ NAPI 层则要负责类型转换和句柄传递。这里最容易出问题的是指针生命周期、字符串释放、空返回值和异常兜底。项目中为 Rust FFI 提供了 sscom_string_free、最后错误信息和 catch_unwind 保护,目的就是避免底层异常直接拖垮应用。

难点三:串口权限和设备节点比桌面端更敏感

应用已经声明 ohos.permission.ACCESS_DDK_USBohos.permission.ACCESS_DDK_USB_SERIAL,但声明权限并不等于所有设备都能直接访问。真机上还要考虑 USB 授权、设备热插拔、系统签名、普通应用权限级别和 /dev/tty* 节点可见性。文章中的截图保留了无设备状态,是因为这个路径在现场非常常见,也最能看出应用是否处理得稳定。

难点四:PC 窗口体验需要重新组织

手机应用常见的单列页面并不适合串口调试。PC 用户更习惯一边看接收日志,一边调整参数和发送数据。鸿蒙 PC 版本采用左侧参数、右侧日志和发送区的布局,并把状态栏固定在底部,减少来回切页。适配时还要注意窗口尺寸、系统避让区、桌面任务栏和浮窗模式,保证在真实 PC 桌面上不会遮挡核心控件。

难点五:构建环境要和工程配置严格匹配

当前工程的 build-profile.json5 面向 HarmonyOS SDK 6.1.0(23) 配置,真机构建验证时也能看到已安装版本使用的是 HarmonyOS 编译链和 arm64-v8a ABI。鸿蒙项目对 SDK、签名材料、Hvigor、CMake、NDK linker 和 Rust target 的匹配要求比较高;只要本机 SDK 缺少对应 compatibleSdkVersion,构建阶段就会被拦截。因此,工程化适配时需要把 SDK 版本、签名配置和 Rust 交叉编译环境提前固定,避免临近打包才暴露问题。

五、当前鸿蒙端架构

项目中的鸿蒙端采用三层结构:

ArkUI 页面
  entry/src/main/ets/pages/Index.ets
  负责界面、状态、参数选择、文件选择和按钮交互

ArkTS 模型层
  entry/src/main/ets/model/SerialPort.ets
  负责封装 NAPI 调用、轮询接收、统计字节数和编码状态

Native 核心层
  entry/src/main/cpp/bridge.cpp
  rust-core/src/lib.rs
  负责 NAPI 注册、Rust FFI、串口读写、HEX 工具和 GBK/UTF-8 转换

主要 NAPI 能力包括:

接口说明
listPorts枚举可用串口并返回字符串数组
openSerial / closeSerial打开和关闭串口句柄
readSerial从串口读取数据并返回 HEX 字符串
writeSerial / writeSerialHex按文本或 HEX 写入串口
setDtr / setRts控制 DTR、RTS 线路
reconfigure在线更新波特率、数据位、校验位、停止位和流控
gbkToUtf8 / utf8ToGbk在中文串口日志和发送内容之间做编码转换

六、构建与安装建议

鸿蒙端源码位于 ohos/ 目录,推荐使用仓库内脚本完成 Rust 静态库和 HAP 的分段构建:

cd ohos

# 完整构建:Rust staticlib -> 复制 .a -> 清理缓存 -> 打包 HAP
bash build.sh

# 只编译 Rust 核心库
bash build.sh --rust

# 只构建 HAP
bash build.sh --hap

构建成功后,产物路径为:

ohos/entry/build/default/outputs/default/entry-default-signed.hap

安装到真机可以使用:

hdc install ohos/entry/build/default/outputs/default/entry-default-signed.hap
hdc shell aa start -a EntryAbility -b com.sscom.serial

需要注意的是,串口访问必须在真机上验证。模拟器通常无法提供真实 USB 串口链路,最多只能验证 UI、文件选择和基础状态流转。

七、当前能力和边界

当前真机版本已经覆盖以下能力:

  • 鸿蒙 PC 上的 HAP 安装、启动和窗口展示;
  • 串口扫描、刷新和无设备空态展示;
  • 波特率、数据位、校验位、停止位、流控等连接参数选择;
  • DTR、RTS 控制入口;
  • HEX 显示、HEX 发送和 CRLF 自动追加;
  • UTF-8、GBK、Latin1 接收编码选择;
  • 文本/HEX 发送区、接收日志区、复制、清空、保存和打开文件入口;
  • 底部状态栏同步 RX/TX 字节数、编码、波特率和串口参数。

后续继续推进时,建议重点补充这些验证:

  • 接入真实 USB 转串口设备后的枚举、授权、打开和关闭稳定性;
  • 文本模式与 HEX 模式下的长时间收发压力测试;
  • GBK 中文日志、多字节截断和混合编码设备的兼容性;
  • DTR/RTS 对目标开发板复位、进入下载模式等场景的实测;
  • 文件发送、接收保存和异常中断后的数据完整性校验。

八、总结

SSCom 的鸿蒙 PC 适配不是简单把桌面串口工具换一个外壳,而是把串口访问、编码转换、HEX 字节处理、文件能力和窗口交互重新放到 HarmonyOS 的应用模型里。项目用 ArkUI 承接桌面操作体验,用 C++ NAPI 做边界桥接,用 Rust 保留底层字节处理和跨平台可维护性,这条路线比较适合开发工具类应用继续演进。

从真机截图可以看到,应用已经能在鸿蒙 PC 上稳定启动,并完成参数选择、HEX 模式、编码选择、无设备拦截和状态展示。后续接入真实串口硬件后,重点应放在权限、热插拔、长时间收发和异常恢复上。串口工具的好用程度,往往不只体现在成功收发那一刻,更体现在设备没接好、参数选错、编码不一致时,能不能让开发者迅速判断问题卡在哪里。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐