feat(ch934x): 添加GPIO方向控制和串口参数配置功能

- 添加Ch934xMode和GpioDirection枚举类定义
- 实现GPIO方向控制相关方法(setGpioDir/queryGpioDirFromCache)
- 添加GPIO使能控制(enableGpio)和数量/组数查询(getGpiocount/getGpiogroup)
- 实现串口参数配置(setSerialParameter)包括波特率/数据位/停止位/校验位/流控
- 添加Break信号控制(setBreak)功能
- 实现当前串口模式查询(getCurrentMode)
- 添加设备连接状态查询(isConnected)和已打开设备列表获取(getConnectedDevices)
- 更新文档说明GPIO方向控制和串口参数配置用法
- 在示例应用中添加相关功能按钮和操作逻辑
This commit is contained in:
Developer
2026-07-07 16:15:11 +08:00
parent 4813e79c80
commit 020904bd2a
8 changed files with 765 additions and 9 deletions
+120 -7
View File
@@ -16,9 +16,13 @@ Android SDK 封装的 Flutter 插件,文档面向其他 Flutter 开发者,介绍
- CH934X 设备枚举、序列号读取、芯片类型识别
- 多串口打开 / 关闭 / **同设备内串口切换**
- 字节级串口读写
- GPIO 输出 / 输入
- GPIO 输出 / 输入 / 方向控制 / 使能
- Modem 控制 (DTR/RTS) 与状态 (CTS/DSR/RI/DCD) 读取
- **主动申请 USB 权限**
- **Break 信号控制**
- **串口参数配置(波特率/数据位/停止位/校验/流控)**
- **查询设备连接状态与已打开设备列表**
- **查询 GPIO 数量、组信息**
- 设备拔出、Modem 错误等异常事件回调
- **底层依赖:** 沁恒官方 `CH934XLib.jar`(插件随包发布,位于
`android/libs/CH934XLib.jar`),通过原生 `CH934XManager` 单例直接调用,
@@ -189,14 +193,40 @@ await sub.cancel();
### 3.4 GPIO 接口
```dart
// 设置 GPIO 输出电平
final ok = await plugin.setGpioOutput(gpioNumber: 0, level: 1);
final value = await plugin.getGpioInput(0); // 负值表示失败
// 读取 GPIO 输入电平(负值表示失败)
final value = await plugin.getGpioInput(0);
```
- `gpioNumber` 与 `level` 与原文档保持一致(0/1)。
- `getGpioInput` 失败时返回 -1,业务方需要自行处理。
- GPIO 操作同样作用于**当前活跃串口**。
### 3.4.1 GPIO 方向控制
```dart
// 使能 GPIO(需要先获取 chipType,可从 Ch934xDeviceInfo.deviceType 取得)
await plugin.enableGpio(chipType: device.deviceType, gpioGroup: 0, enable: 1);
// 设置 GPIO 方向
await plugin.setGpioDir(gpioGroup: 0, gpioNumber: 0, dir: GpioDirection.out);
// 从缓存查询 GPIO 方向
final dir = await plugin.queryGpioDirFromCache(gpioGroup: 0, gpioNumber: 0);
if (dir == GpioDirection.out) { /* 输出 */ }
// 查询 GPIO 数量与组数
final count = await plugin.getGpiocount(device.deviceId);
final groups = await plugin.getGpiogroup(device.deviceId);
```
- `GpioDirection` 常量: `in_ = 0`(输入)、`out = 1`(输出)。
- `enableGpio` 的 `enable` 参数: CH9344 传 1/0 控制整组;CH348 使用位掩码。
- 方向查询返回 -1 表示失败。
- `getGpiocount`/`getGpiogroup` 失败时返回 -1,需先 `openPort`。
### 3.5 Modem 控制接口
```dart
@@ -224,6 +254,78 @@ final sub = await plugin.setExceptionCallback((event) {
await sub.cancel();
```
- 异常类型见 `Ch934xExceptionType`:
- `deviceDetached = 1`:设备被拔出(由 SDK 的 `usbDeviceDetach` 触发)。
- `ioError = 2`:Modem overrun / parity / frame 等错误。
- `sdk = 3`:原生 SDK 主动抛出的其他异常(目前未触发,保留语义)。
- `unknown = 0`:未识别(当前未触发,保留语义)。
- `Ch934xException` 包含 `type / message / cause`,`toString()` 会把
`type` 翻译为对应的常量名,方便日志/UI 显示。
- 返回的 `StreamSubscription` **必须在合适时机 `cancel`**,以便
释放底层 `StreamController` 与 `MethodCallHandler`。
### 3.7 其他接口
#### 3.7.1 Break 信号
```dart
final ok = await plugin.setBreak(true); // 设置 Break(低电平有效)
```
- 作用于**当前活跃串口**。
#### 3.7.2 获取当前串口模式
```dart
final mode = await plugin.getCurrentMode();
// mode 取值见 Ch934xMode 常量
```
- `Ch934xMode` 常量: `normal = 0`(普通)、`hardflow = 1`(硬件流控)、`gpio = 2`(GPIO)。
- **仅对 CH934X 型号有效**,CH348 返回 -1。
#### 3.7.3 设备连接状态
```dart
final connected = await plugin.isConnected(device.deviceId);
final ids = await plugin.getConnectedDevices();
```
- `isConnected`: 查询指定设备是否已被打开。
- `getConnectedDevices`: 返回当前已打开设备的 `deviceId` 列表。
### 3.8 串口参数配置
```dart
// 配置波特率为 9600
final ok = await plugin.setSerialParameter(
baud: 9600,
dataBit: 8,
stopBit: 1,
parityBit: 0,
flow: false,
);
```
- 作用于**当前活跃串口**。`openPort` 内部默认设为 `115200/8/1/N/无流控`,
如需修改可在此之后调用。
- `stopBit`: 0=1 停止位,1=1.5 停止位,2=2 停止位。
- `parityBit`: 0=无校验,1=奇校验,2=偶校验。
---
## 4. 完整示例
```dart
final sub = await plugin.setExceptionCallback((event) {
debugPrint('设备异常: ${event.type} ${event.message}');
// 业务方应主动关闭串口、刷新设备列表或提示用户重新插拔
});
// 主动取消监听
await sub.cancel();
```
- 异常类型见 `Ch934xExceptionType`:
- `deviceDetached = 1`:设备被拔出(由 SDK 的 `usbDeviceDetach` 触发)。
- `ioError = 2`:Modem overrun / parity / frame 等错误。
@@ -346,9 +448,9 @@ void main() {
才返回真实数据,枚举阶段调用只会得到空列表。
**Q3. `read()` 一直返回空数组。**
- 确认对端设备正在发送数据,且波特率/校验位等参数与原 SDK 默认值
一致(`CH934XLib` 提供独立的 `setConfig` 接口,本插件当前未做
封装,需要时可扩展原 SDK 直接调用)
- 确认对端设备正在发送数据,且波特率/校验位等参数匹配。可通过
`setSerialParameter(baud: 9600, dataBit: 8, stopBit: 1, parityBit: 0, flow: false)`
配置串口参数
- 检查线序:RX/TX 是否接反,以及硬件流控是否正确。
- 确认 `setActivePort` 已切换到正确的串口索引。
@@ -398,12 +500,23 @@ void main() {
| `requestUsbPermission` | 2.2 增强 | 主动授权(插件新增) |
| `read` | 6.1.1 | 串口读写 |
| `write` | 6.2.1 | 串口读写 |
| `setGpioOutput` | 7.1.1 | GPIO |
| `getGpioInput` | 7.1.2 | GPIO |
| `setSerialParameter` | setSerialParameter | 串口参数 |
| `setBreak` | setBreak | 其他 |
| `getCurrentMode` | getCurrentMode | 其他 |
| `isConnected` | isConnected | 设备状态 |
| `getConnectedDevices` | getConnectedDevices | 设备状态 |
| `setGpioOutput` | setGPIOValue | GPIO |
| `getGpioInput` | getGPIOValue | GPIO |
| `setGpioDir` | setGPIODir | GPIO 方向 |
| `queryGpioDirFromCache` | queryGPIODirFromCache | GPIO 方向 |
| `enableGpio` | enableGPIO | GPIO |
| `getGpiocount` | getGPIOCount | GPIO |
| `getGpiogroup` | getGPIOGroup | GPIO |
| `setModemControl` | 7.2.1 | Modem |
| `getModemStatus` | 7.2.2 | Modem |
| `setExceptionCallback` | 7.3.1 | 异常 |
| `dataStream` | 6.1 增强 | 串口流(插件新增) |
| `portDataStream` | 6.1 增强 | 多端口轮询流(插件新增) |
---