From 3a154bdb0a5aaa2c0ac3eac95a6ba747068bd454 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期二, 13 一月 2026 10:00:37 +0800
Subject: [PATCH] 优化

---
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortModel.java |  130 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 130 insertions(+), 0 deletions(-)

diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortModel.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortModel.java
new file mode 100644
index 0000000..f79b81a
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortModel.java
@@ -0,0 +1,130 @@
+package com.doumee.keyCabinet.utils.i485;
+
+import android.serialport.SerialPort;
+import android.util.Log;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+public class SerialPortModel {
+
+    public static final String TAG = SerialPortModel.class.getSimpleName();
+
+    private void logI(String str) {
+        Log.i(TAG, str);
+    }
+
+    private String serialPortPath;
+    private int baudrate;
+    private int dataBits;
+    private int stopBits;
+    private int parity;
+    private SerialPort serialPort;
+    private ScheduledExecutorService scheduledExecutorService;
+    private ExecutorService singleThreadExecutor;
+    private ScheduledFuture scheduledFuture;
+    private SerialPortReadObserver serialPortReadObserver;
+    private boolean isOk = false;
+
+    private final Object writeLock = new Object();
+
+    public SerialPortModel(String serialPortPath, int baudrate, int dataBits, int stopBits, int parity,SerialPortReadObserver portReadObserver) {
+        this.serialPortPath = serialPortPath;
+        this.baudrate = baudrate;
+        this.dataBits = dataBits;
+        this.stopBits = stopBits;
+        this.parity = parity;
+        this.serialPortReadObserver = portReadObserver;
+    }
+
+    public boolean open() {
+        try {
+            File device = new File(serialPortPath);
+            serialPort = SerialPort
+                    .newBuilder(device, baudrate)
+                    .dataBits(dataBits)
+                    .stopBits(stopBits)
+                    .parity(parity)
+                    .build();
+            scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
+            singleThreadExecutor = Executors.newSingleThreadExecutor();
+        } catch (IOException e) {
+            e.printStackTrace();
+            return false;
+        }
+        return true;
+    }
+
+    public void close() {
+        try {
+            serialPort.getInputStream().close();
+            serialPort.getOutputStream().close();
+            serialPort.close();
+            serialPort = null;
+            scheduledExecutorService.shutdown();
+            singleThreadExecutor.shutdown();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void startRead() {
+        scheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> {
+            InputStream inputStream = serialPort.getInputStream();
+            byte[] bytes = new byte[2048];
+            int length = 0;
+            try {
+                length = inputStream.read(bytes);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+//            logI("startRead - length: " + length);
+            if (length <= 0) return;
+            //String result = new String(bytes, 0, length);
+            byte[] bytes2 = new byte[length];
+            for(int i=0;i<length;i++){
+                bytes2[i] = bytes[i];
+            }
+            if(serialPortReadObserver!=null) {
+                serialPortReadObserver.onResultBytes(bytes2);
+            }
+        }, 0, 100, TimeUnit.MILLISECONDS);
+    }
+
+    public void stopRead() {
+        scheduledFuture.cancel(true);
+    }
+
+    public void write(byte[] bytes) {
+        singleThreadExecutor.execute(() -> {
+            synchronized (writeLock) {
+                try {
+                    serialPort.getOutputStream().write(bytes);
+                    if(serialPortReadObserver!=null) {
+                        serialPortReadObserver.onResult(null);
+                    }
+                } catch (IOException e) {
+                    e.printStackTrace();
+                    if(serialPortReadObserver!=null) {
+                        serialPortReadObserver.onResult(e.getMessage());
+                    }
+                }
+            }
+        });
+    }
+
+    public boolean isOk() {
+        return isOk;
+    }
+
+    public void setOk(boolean ok) {
+        isOk = ok;
+    }
+}
+

--
Gitblit v1.9.3