From 2b756769ea4adad21332d8a294871712cd42cc3f Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期三, 26 十一月 2025 13:57:24 +0800
Subject: [PATCH] 优化了轮询逻辑注意有打印输出

---
 src/publicway/SerialProtocolParser.java |  117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 112 insertions(+), 5 deletions(-)

diff --git a/src/publicway/SerialProtocolParser.java b/src/publicway/SerialProtocolParser.java
index 732c879..36ccf34 100644
--- a/src/publicway/SerialProtocolParser.java
+++ b/src/publicway/SerialProtocolParser.java
@@ -2,9 +2,12 @@
 
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
+import java.util.Collections;
+import java.util.Set;
 
 import chuankou.SerialPortService;
 import chushihua.SlotManager;
@@ -54,6 +57,13 @@
     // 瀵硅薄姹狅紝鍑忓皯瀵硅薄鍒涘缓
     private final Object packetPoolLock = new Object();
     
+    // ==================== 鏂板锛氭暟鎹寘鍘婚噸缂撳瓨 ====================
+    private final Set<String> processedPacketCache = Collections.newSetFromMap(
+        new ConcurrentHashMap<String, Boolean>());
+    private static final int MAX_CACHE_SIZE = 1000;
+    private static final long CACHE_CLEANUP_INTERVAL = 60000; // 1鍒嗛挓娓呯悊涓�娆$紦瀛�
+    private long lastCacheCleanupTime = 0;
+    
     /**
      * 鍚姩瑙f瀽鍣�
      */
@@ -64,9 +74,8 @@
         
         isRunning = true;
         
-        // 鍚姩鎵归噺澶勭悊锛堟瘡50ms澶勭悊涓�娆★級
-        batchExecutor.scheduleAtFixedRate(this::batchProcess, 50, 50, TimeUnit.MILLISECONDS);
-        
+        // 鍚姩鎵归噺澶勭悊锛堟瘡10ms澶勭悊涓�娆★級
+        batchExecutor.scheduleAtFixedRate(this::batchProcess, 10, 10, TimeUnit.MILLISECONDS);
         processorThread = new Thread(this::processPackets, "Serial-Protocol-Parser");
         processorThread.setDaemon(true);
         processorThread.start();
@@ -106,6 +115,9 @@
         // 娓呯┖闃熷垪鍜岀紦鍐插尯
         clearQueues();
         bufferPosition = 0;
+        
+        // 娓呯┖鍘婚噸缂撳瓨
+        processedPacketCache.clear();
     }
     
     /**
@@ -203,6 +215,9 @@
             // 瀹氭湡妫�鏌ュ唴瀛�
             checkMemory();
             
+            // 瀹氭湡娓呯悊鍘婚噸缂撳瓨
+            cleanupPacketCache();
+            
         } catch (Exception e) {
             System.err.println("鎵归噺澶勭悊鏁版嵁鏃跺彂鐢熷紓甯�: " + e.getMessage());
             // 鍙戠敓寮傚父鏃堕噸缃姸鎬�
@@ -275,6 +290,26 @@
     }
     
     /**
+     * 娓呯悊鏁版嵁鍖呭幓閲嶇紦瀛�
+     */
+    private void cleanupPacketCache() {
+        long currentTime = System.currentTimeMillis();
+        if (currentTime - lastCacheCleanupTime < CACHE_CLEANUP_INTERVAL) {
+            return;
+        }
+        
+        lastCacheCleanupTime = currentTime;
+        
+        // 濡傛灉缂撳瓨澶у皬瓒呰繃闄愬埗锛屾竻绌虹紦瀛�
+        if (processedPacketCache.size() >= MAX_CACHE_SIZE) {
+            processedPacketCache.clear();
+            if (lunxun.DEBUG_ENABLED) {
+                SystemDebugDialog.appendAsciiData("鏁版嵁鍖呭幓閲嶇紦瀛樺凡娓呯┖锛屽綋鍓嶅ぇ灏�: " + processedPacketCache.size());
+            }
+        }
+    }
+    
+    /**
      * 澶勭悊缂撳啿鍖轰腑鐨勬暟鎹紝瑙f瀽瀹屾暣鏁版嵁鍖�
      */
     private void processBuffer() {
@@ -318,6 +353,27 @@
             // 鎻愬彇瀹屾暣鏁版嵁鍖�
             byte[] packet = extractPacket(startIndex, totalPacketLength);
             if (packet != null) {
+                // ==================== 鏂板锛氭暟鎹寘鍘婚噸妫�鏌� ====================
+                String packetHash = generatePacketHash(packet);
+                if (processedPacketCache.contains(packetHash)) {
+                    // 璺宠繃閲嶅鏁版嵁鍖�
+                    if (lunxun.DEBUG_ENABLED) {
+                        SystemDebugDialog.appendAsciiData("璺宠繃閲嶅鏁版嵁鍖�: " + bytesToHex(packet));
+                    }
+                    
+                    // 绉诲姩缂撳啿鍖轰綅缃紝缁х画澶勭悊涓嬩竴涓寘
+                    int remaining = bufferPosition - (startIndex + totalPacketLength);
+                    if (remaining > 0) {
+                        System.arraycopy(dataBuffer, startIndex + totalPacketLength, dataBuffer, 0, remaining);
+                    }
+                    bufferPosition = remaining;
+                    processedCount++;
+                    continue;
+                }
+                
+                // 娣诲姞鍒板幓閲嶇紦瀛�
+                processedPacketCache.add(packetHash);
+                
                 // 灏嗘暟鎹寘鏀惧叆闃熷垪渚涜В鏋�
                 if (!dataQueue.offer(packet)) {
                     // 闃熷垪宸叉弧锛岄噴鏀緋acket寮曠敤
@@ -339,6 +395,35 @@
     }
     
     /**
+     * 鐢熸垚鏁版嵁鍖呭搱甯屽�肩敤浜庡幓閲�
+     * 鍩轰簬鍏抽敭瀛楁锛氫富鏈哄湴鍧� + 鍗℃Ы鍦板潃 + 鍔熻兘鐮� + 鏁版嵁鍐呭
+     */
+    private String generatePacketHash(byte[] packet) {
+        if (packet == null || packet.length < 7) {
+            return "";
+        }
+        
+        StringBuilder key = new StringBuilder(64);
+        
+        // 娣诲姞鍗忚澶翠俊鎭�
+        key.append(packet[4] & 0xFF).append(":"); // 涓绘満鍦板潃 (浣嶇疆4)
+        key.append(packet[5] & 0xFF).append(":"); // 鍗℃Ы鍦板潃 (浣嶇疆5)  
+        key.append(packet[6] & 0xFF).append(":"); // 鍔熻兘鐮� (浣嶇疆6)
+        
+        // 娣诲姞鏁版嵁鍐呭鍝堝笇锛堟帓闄ゅ寘澶村拰CRC锛�
+        int dataStart = 7; // 鏁版嵁寮�濮嬩綅缃�
+        int dataEnd = packet.length - 2; // 鎺掗櫎CRC瀛楄妭
+        
+        // 鍙栨暟鎹唴瀹圭殑鍓�20涓瓧鑺備綔涓哄搱甯屼緷鎹�
+        int hashLength = Math.min(dataEnd - dataStart, 20);
+        for (int i = dataStart; i < dataStart + hashLength && i < dataEnd; i++) {
+            key.append(String.format("%02X", packet[i]));
+        }
+        
+        return key.toString();
+    }
+    
+    /**
      * 鎻愬彇鏁版嵁鍖咃紝閲嶇敤byte鏁扮粍鍑忓皯瀵硅薄鍒涘缓
      */
     private byte[] extractPacket(int startIndex, int totalPacketLength) {
@@ -408,6 +493,7 @@
      * 瑙f瀽鏁版嵁鍖呭苟鏍规嵁鍔熻兘鐮佽皟鐢ㄧ浉搴旀柟娉�
      */
     private void parsePacket(byte[] packet) {
+        System.out.println("寮�濮嬭В鏋愭敹鍒扮殑鏁版嵁"+bytesToHex(packet)+"鏃堕棿"+TimestampUtil.getTimestamp());
         if (packet == null || packet.length < MIN_PACKET_LENGTH) {
             return;
         }
@@ -418,6 +504,7 @@
             byte hostAddress = packet[4];        // 涓绘満鍦板潃
             byte slotAddress = packet[5];        // 鍗℃Ы鍦板潃
             byte functionCode = packet[6];       // 鍔熻兘鐮�           
+            
             // 鏁版嵁闀垮害 (浠庡崗璁腑璇诲彇)
             int dataLength = ((packet[2] & 0xFF) << 8) | (packet[3] & 0xFF);
             
@@ -529,14 +616,16 @@
      * 鑾峰彇瑙f瀽鍣ㄧ姸鎬佷俊鎭�
      */
     public String getStatusInfo() {
-        return String.format("涓插彛瑙f瀽鍣ㄧ姸鎬�: %s, 闃熷垪澶у皬: %d/%d, 鎵归噺闃熷垪: %d/%d, 缂撳啿鍖�: %d/%d", 
+        return String.format("涓插彛瑙f瀽鍣ㄧ姸鎬�: %s, 闃熷垪澶у皬: %d/%d, 鎵归噺闃熷垪: %d/%d, 缂撳啿鍖�: %d/%d, 鍘婚噸缂撳瓨: %d/%d", 
                            isRunning ? "杩愯涓�" : "宸插仠姝�", 
                            dataQueue.size(), 
                            dataQueue.remainingCapacity() + dataQueue.size(),
                            batchQueue.size(),
                            batchQueue.remainingCapacity() + batchQueue.size(),
                            bufferPosition,
-                           dataBuffer.length);
+                           dataBuffer.length,
+                           processedPacketCache.size(),
+                           MAX_CACHE_SIZE);
     }
     
     /**
@@ -554,5 +643,23 @@
         clearQueues();
         bufferPosition = 0;
         hexBuilder.setLength(0);
+        processedPacketCache.clear();
+    }
+    
+    /**
+     * 鎵嬪姩娓呯┖鏁版嵁鍖呭幓閲嶇紦瀛橈紙鐢ㄤ簬璋冭瘯鎴栫壒娈婃儏鍐碉級
+     */
+    public void clearPacketCache() {
+        processedPacketCache.clear();
+        if (lunxun.DEBUG_ENABLED) {
+            SystemDebugDialog.appendAsciiData("鏁版嵁鍖呭幓閲嶇紦瀛樺凡鎵嬪姩娓呯┖");
+        }
+    }
+    
+    /**
+     * 鑾峰彇鍘婚噸缂撳瓨澶у皬锛堢敤浜庣洃鎺э級
+     */
+    public int getPacketCacheSize() {
+        return processedPacketCache.size();
     }
 }
\ No newline at end of file

--
Gitblit v1.10.0