diff --git a/android/src/main/java/com/example/ch34/Ch34Plugin.java b/android/src/main/java/com/example/ch34/Ch34Plugin.java index f551376..4f8923a 100644 --- a/android/src/main/java/com/example/ch34/Ch34Plugin.java +++ b/android/src/main/java/com/example/ch34/Ch34Plugin.java @@ -56,6 +56,18 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler { /** 全局 WCHUARTManager 实例 */ private WCHUARTManager manager; + /** + * 维护 Modem 信号绝对电平状态。 + * + * WCH SDK IModemStatus.onStatusChanged 的参数 isDSRRaised/isCTSRaised/isDCDRaised/isRINGRaised + * 在字面上是"上升沿标志",但实际观察表明其行为符合电平值(true=高电平,false=低电平)。 + * 为确保语义明确且不受 SDK 行为变化影响,在此维护绝对电平状态。 + */ + private boolean currentDSRLevel = false; + private boolean currentCTSLevel = false; + private boolean currentDCDLevel = false; + private boolean currentRINGLevel = false; + @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { channel = new MethodChannel(binding.getBinaryMessenger(), "ch34"); @@ -545,6 +557,7 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler { manager.disconnect(device); openedDevices.remove(deviceName); usbStateStreamHandler.notifyStateChanged(deviceName, false); + resetModemStatusLevels(); } result.success(null); } catch (Exception e) { @@ -578,6 +591,7 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler { } } openedDevices.clear(); + resetModemStatusLevels(); } // ==================== GPIO 功能 ==================== @@ -752,14 +766,22 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler { @Override public void onStatusChanged(int serialNumber, boolean isDCDRaised, boolean isDSRRaised, boolean isCTSRaised, boolean isRINGRaised) { + // 根据 SDK 回调参数更新绝对电平状态 + // WCH SDK 的 isDSRRaised 等参数在每次状态变化回调中表示该信号的 + // 当前电平值:true=高电平,false=低电平 + currentDCDLevel = isDCDRaised; + currentDSRLevel = isDSRRaised; + currentCTSLevel = isCTSRaised; + currentRINGLevel = isRINGRaised; + Log.d(TAG, "Modem onStatusChanged: serial=" + serialNumber - + " dcd=" + isDCDRaised + " dsr=" + isDSRRaised - + " cts=" + isCTSRaised + " ri=" + isRINGRaised); + + " dcd=" + currentDCDLevel + " dsr=" + currentDSRLevel + + " cts=" + currentCTSLevel + " ri=" + currentRINGLevel); Map map = new HashMap<>(); - map.put("dcd", isDCDRaised); - map.put("dsr", isDSRRaised); - map.put("cts", isCTSRaised); - map.put("ri", isRINGRaised); + map.put("dcd", currentDCDLevel); + map.put("dsr", currentDSRLevel); + map.put("cts", currentCTSLevel); + map.put("ri", currentRINGLevel); Log.d(TAG, "Sending modem status to Flutter: " + map); modemStreamHandler.sendStatus(map); } @@ -786,6 +808,8 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler { private void removeModemStatusCallback(@NonNull MethodCall call, @NonNull Result result) { try { modemStreamHandler.stopListening(); + // 重置 Modem 信号绝对电平状态,防止重连时状态残留 + resetModemStatusLevels(); result.success(null); } catch (Exception e) { Log.e(TAG, "removeModemStatusCallback error", e); @@ -858,6 +882,18 @@ public class Ch34Plugin implements FlutterPlugin, MethodCallHandler { // ==================== 辅助方法 ==================== + /** + * 重置 Modem 信号绝对电平状态。 + * + * 在移除 Modem 回调或关闭设备时调用,确保下次注册回调时状态干净。 + */ + private void resetModemStatusLevels() { + currentDSRLevel = false; + currentCTSLevel = false; + currentDCDLevel = false; + currentRINGLevel = false; + } + private void ensureManagerInitialized() { if (manager == null) { Application app;