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

---
 bin/home/CardMachineUI.class             |    0 
 bin/publicway/SerialProtocolParser.class |    0 
 bin/chushihua/SlotManager.class          |    0 
 bin/.gitignore                           |    2 
 src/chushihua/lunxun.java                |  185 ++++++++++++-------------
 src/publicway/SerialProtocolParser.java  |  117 ++++++++++++++++
 bin/chushihua/lunxun.class               |    0 
 src/chushihua/SlotManager.java           |    4 
 bin/chushihua/lunxun$PollingTask.class   |    0 
 src/chuankou/SerialPortService.java      |   10 +
 bin/chuankou/SerialPortService.class     |    0 
 log.properties                           |   26 +++
 src/home/CardMachineUI.java              |   18 +
 13 files changed, 251 insertions(+), 111 deletions(-)

diff --git a/bin/.gitignore b/bin/.gitignore
index 9a0ec28..1971ae3 100644
--- a/bin/.gitignore
+++ b/bin/.gitignore
@@ -1,5 +1,7 @@
 /chuankou/
 /chushihua/
+/dialog/
 /home/
+/jiekou/
 /publicway/
 /xitongshezhi/
diff --git a/bin/chuankou/SerialPortService.class b/bin/chuankou/SerialPortService.class
index 2f2422e..3e07c98 100644
--- a/bin/chuankou/SerialPortService.class
+++ b/bin/chuankou/SerialPortService.class
Binary files differ
diff --git a/bin/chushihua/SlotManager.class b/bin/chushihua/SlotManager.class
index e8e3056..ddda933 100644
--- a/bin/chushihua/SlotManager.class
+++ b/bin/chushihua/SlotManager.class
Binary files differ
diff --git a/bin/chushihua/lunxun$PollingTask.class b/bin/chushihua/lunxun$PollingTask.class
index fa85784..d8182a8 100644
--- a/bin/chushihua/lunxun$PollingTask.class
+++ b/bin/chushihua/lunxun$PollingTask.class
Binary files differ
diff --git a/bin/chushihua/lunxun.class b/bin/chushihua/lunxun.class
index 534d698..a69f4ae 100644
--- a/bin/chushihua/lunxun.class
+++ b/bin/chushihua/lunxun.class
Binary files differ
diff --git a/bin/home/CardMachineUI.class b/bin/home/CardMachineUI.class
index a49d9c9..550f306 100644
--- a/bin/home/CardMachineUI.class
+++ b/bin/home/CardMachineUI.class
Binary files differ
diff --git a/bin/publicway/SerialProtocolParser.class b/bin/publicway/SerialProtocolParser.class
index b91af32..ca0fde3 100644
--- a/bin/publicway/SerialProtocolParser.class
+++ b/bin/publicway/SerialProtocolParser.class
Binary files differ
diff --git a/log.properties b/log.properties
index 50d0198..6b349be 100644
--- a/log.properties
+++ b/log.properties
@@ -1,5 +1,5 @@
-#\u64CD\u4F5C\u65E5\u5FD7\u8BB0\u5F55 - \u6700\u540E\u66F4\u65B0: Sat Nov 22 15:43:14 CST 2025
-#Sat Nov 22 15:43:14 CST 2025
+#\u64CD\u4F5C\u65E5\u5FD7\u8BB0\u5F55 - \u6700\u540E\u66F4\u65B0: Wed Nov 26 13:54:51 CST 2025
+#Wed Nov 26 13:54:51 CST 2025
 log_1763724957486_7ed8425e=[2025-11-21 19\:35\:57] 鍙栧崱鎿嶄綔锛氬崱妲�1琚鐞嗗憳鍙栧崱
 log_1763724957585_8967e0b2=[2025-11-21 19\:35\:57] 鍙栧崱鎿嶄綔锛氬崱妲�2琚鐞嗗憳鍙栧崱
 log_1763724957735_6574dba5=[2025-11-21 19\:35\:57] 鍙栧崱鎿嶄綔锛氬崱妲�3琚鐞嗗憳鍙栧崱
@@ -115,3 +115,25 @@
 log_1763797394271_ad30a236=[2025-11-22 15\:43\:14] DDCC0008F003515AA55AA5027A7E;type2鎺у埗鎵撳紑3鏌滈棬
 log_1763797394281_00876aa0=[2025-11-22 15\:43\:14] 鍙栧崱鎿嶄綔锛氬崱妲�3琚鐞嗗憳鍙栧崱
 log_1763797394622_9137f63b=[2025-11-22 15\:43\:14] 3鍙峰崱妲藉彇鍗″け璐�
+log_1764135397723_84402e54=[2025-11-26 13\:36\:37] DDCC0008F010515AA55AA502BB5C;type2鎺у埗鎵撳紑16鏌滈棬
+log_1764135398043_85ab4e55=[2025-11-26 13\:36\:38] 鍙栧崱鎿嶄綔锛氬崱妲�16琚鐞嗗憳鍙栧崱
+log_1764135398198_2349ce0d=[2025-11-26 13\:36\:38] DDCC0008F011515AA55AA5027B4C;type2鎺у埗鎵撳紑17鏌滈棬
+log_1764135398521_707e724d=[2025-11-26 13\:36\:38] 鍙栧崱鎿嶄綔锛氬崱妲�17琚鐞嗗憳鍙栧崱
+log_1764135398672_2ff90b31=[2025-11-26 13\:36\:38] DDCC0008F012515AA55AA5027B7F;type2鎺у埗鎵撳紑18鏌滈棬
+log_1764135399002_72e36700=[2025-11-26 13\:36\:39] 鍙栧崱鎿嶄綔锛氬崱妲�18琚鐞嗗憳鍙栧崱
+log_1764135399101_6cfd16ca=[2025-11-26 13\:36\:39] DDCC0008F013515AA55AA502BB6F;type2鎺у埗鎵撳紑19鏌滈棬
+log_1764135399422_6d2b3023=[2025-11-26 13\:36\:39] 19鍙峰崱妲藉彇鍗″け璐�
+log_1764135400746_19bde6e5=[2025-11-26 13\:36\:40] DDCC0008F012515AA55AA5027B7F;type2鎺у埗鎵撳紑18鏌滈棬
+log_1764135401072_bfc61929=[2025-11-26 13\:36\:41] 鍙栧崱鎿嶄綔锛氬崱妲�18琚鐞嗗憳鍙栧崱
+log_1764135401428_8765a316=[2025-11-26 13\:36\:41] DDCC0008F013515AA55AA502BB6F;type2鎺у埗鎵撳紑19鏌滈棬
+log_1764135401751_b0dc6eeb=[2025-11-26 13\:36\:41] 鍙栧崱鎿嶄綔锛氬崱妲�19琚鐞嗗憳鍙栧崱
+log_1764135403137_780179c3=[2025-11-26 13\:36\:43] DDCC0008F013515AA55AA502BB6F;type2鎺у埗鎵撳紑19鏌滈棬
+log_1764135403461_84264232=[2025-11-26 13\:36\:43] 鍙栧崱鎿嶄綔锛氬崱妲�19琚鐞嗗憳鍙栧崱
+log_1764136489886_1b915fb2=[2025-11-26 13\:54\:49] DDCC0008F010515AA55AA502BB5C;type2鎺у埗鎵撳紑16鏌滈棬
+log_1764136490213_558da777=[2025-11-26 13\:54\:50] 鍙栧崱鎿嶄綔锛氬崱妲�16琚鐞嗗憳鍙栧崱
+log_1764136490338_35642c9c=[2025-11-26 13\:54\:50] DDCC0008F011515AA55AA5027B4C;type2鎺у埗鎵撳紑17鏌滈棬
+log_1764136490673_e331bdd6=[2025-11-26 13\:54\:50] 鍙栧崱鎿嶄綔锛氬崱妲�17琚鐞嗗憳鍙栧崱
+log_1764136490851_72a1541e=[2025-11-26 13\:54\:50] DDCC0008F012515AA55AA5027B7F;type2鎺у埗鎵撳紑18鏌滈棬
+log_1764136491173_e8aa6057=[2025-11-26 13\:54\:51] 鍙栧崱鎿嶄綔锛氬崱妲�18琚鐞嗗憳鍙栧崱
+log_1764136491324_8d1b32d1=[2025-11-26 13\:54\:51] DDCC0008F013515AA55AA502BB6F;type2鎺у埗鎵撳紑19鏌滈棬
+log_1764136491652_fa44283b=[2025-11-26 13\:54\:51] 鍙栧崱鎿嶄綔锛氬崱妲�19琚鐞嗗憳鍙栧崱
diff --git a/src/chuankou/SerialPortService.java b/src/chuankou/SerialPortService.java
index e2e835b..edddf8a 100644
--- a/src/chuankou/SerialPortService.java
+++ b/src/chuankou/SerialPortService.java
@@ -6,6 +6,7 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import publicway.SerialProtocolParser; // 娣诲姞瀵煎叆
+import publicway.TimestampUtil;
 import xitongshezhi.SystemDebugDialog;
 
 public class SerialPortService {
@@ -181,6 +182,7 @@
 	            if (len > 0) {
 	                buffer.write(readBuffer, 0, len);
 	                lastReceivedTime = currentTime;
+	                System.out.println("鏀跺埌鍘熷鏁版嵁: " + bytesToHex(readBuffer, len)+"鏃堕棿"+TimestampUtil.getTimestamp());
 	            }
 
 	            if (len <= 0 && buffer.size() == 0) {
@@ -264,5 +266,11 @@
 		int result = port.writeBytes(data, data.length);
 		return result > 0;
 	}
-
+	private String bytesToHex(byte[] bytes, int length) {
+	    StringBuilder sb = new StringBuilder();
+	    for (int i = 0; i < length; i++) {
+	        sb.append(String.format("%02X ", bytes[i]));
+	    }
+	    return sb.toString().trim();
+	}
 }
\ No newline at end of file
diff --git a/src/chushihua/SlotManager.java b/src/chushihua/SlotManager.java
index b85cb60..bec177f 100644
--- a/src/chushihua/SlotManager.java
+++ b/src/chushihua/SlotManager.java
@@ -7,6 +7,7 @@
 
 import dialog.Dingshidialog;
 import home.Fkj;
+import publicway.TimestampUtil;
 
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -529,7 +530,8 @@
 						slotNumber+"鍙峰崱妲借繕鍗℃垚鍔熸劅璋㈡偍鐨勪娇鐢�"
 						);
 			});
-			//System.out.println("鍗℃Ы " + slotNumber + " 杩樺崱鎴愬姛锛屽崱鍙蜂粠 " + oldCardNumber + " 鍙樹负 " + newCardNumber);
+//			System.out.println("杩樺崱鎴愬姛" + slotNumber + " 杩樺崱鎴愬姛锛屽崱鍙蜂粠 " + oldCardNumber + " 鍙樹负 " + newCardNumber);
+			System.out.println("杩樺崱鎴愬姛"+slotNumber +"鏃堕棿"+ " 杩樺崱鎴愬姛锛屽崱鍙蜂粠 " + oldCardNumber + " 鍙樹负 " + newCardNumber+TimestampUtil.getTimestamp());
 		}
 	}
 	
diff --git a/src/chushihua/lunxun.java b/src/chushihua/lunxun.java
index 2e3420d..c3ffeb7 100644
--- a/src/chushihua/lunxun.java
+++ b/src/chushihua/lunxun.java
@@ -5,6 +5,7 @@
 import home.Fkj;
 import home.MachineConfig;
 import publicway.QueryData;
+import publicway.TimestampUtil;
 import xitongshezhi.SystemDebugDialog;
 
 import java.util.Iterator;
@@ -24,7 +25,7 @@
 	private static volatile boolean isPaused = false;
 	private static final AtomicBoolean shouldStop = new AtomicBoolean(false);
 	private static Thread pollingThread;
-	private static int pollingInterval = 100; // 榛樿杞闂撮殧
+	private static int pollingInterval =50; // 榛樿杞闂撮殧
 	public static boolean sendChaxunzhiling=true;//鏄惁鍚戜覆鍙e彂閫佹煡璇㈡寚浠�
 	// 娣诲姞闈欐�佸彉閲忔帶鍒朵汉鑴告娴�
 	public static boolean ishaveface = false; // 鏄惁妫�娴嬪埌浜鸿劯锛岄粯璁ゆ病鏈変汉鑴�
@@ -370,19 +371,17 @@
 	 * 浼樺寲锛氬唴瀛樼鐞嗗拰閲嶇敤瀵硅薄
 	 */
 	private static class PollingTask implements Runnable {
-		private int currentIndex = 0; // 褰撳墠绱㈠紩锛岀敤浜庨亶鍘唖lotArray
-		private int consecutiveFailures = 0; // 杩炵画澶辫触娆℃暟
-		private static final int MAX_CONSECUTIVE_FAILURES = 5; // 鏈�澶ц繛缁け璐ユ鏁�
-		private final StringBuilder debugBuilder = new StringBuilder(100); // 閲嶇敤 StringBuilder
+	    private int currentIndex = 0; // 褰撳墠绱㈠紩锛岀敤浜庨亶鍘唖lotArray
+	    private int consecutiveFailures = 0; // 杩炵画澶辫触娆℃暟
+	    private static final int MAX_CONSECUTIVE_FAILURES = 5; // 鏈�澶ц繛缁け璐ユ鏁�
+	    private final StringBuilder debugBuilder = new StringBuilder(100); // 閲嶇敤 StringBuilder
 
-		@Override
-		public void run() {
+	    @Override
+	    public void run() {
 	        //System.out.println("杞鏌ヨ绾跨▼寮�濮嬭繍琛�");
 
 	        while (isRunning && !Thread.currentThread().isInterrupted() && !shouldStop.get()) {
 	            try {
-
-//	              System.out.println("鏌ヨ涓�.....绾跨▼");
 	                // 妫�鏌ユ槸鍚︽殏鍋�
 	                if (isPaused) {
 	                    synchronized (lunxun.class) {
@@ -413,81 +412,69 @@
 	                    continue;
 	                }
 
-	                // 鏂板锛氭牴鎹崱妲界姸鎬佸拰鏌ヨ棰戠巼鍐冲畾鏄惁鍙戦�佹煡璇�
-	                boolean sentQuery = false;
-	                long currentTime = System.currentTimeMillis();
-
-	                // 閬嶅巻鍗℃Ы锛屽鎵鹃渶瑕佹煡璇㈢殑鍗℃Ы
-	                for (int i = 0; i < slotArray.length && !sentQuery; i++) {
+	                // 閬嶅巻鎵�鏈夊崱妲�
+	                for (int i = 0; i < slotArray.length; i++) {
+	                    if (!isRunning || shouldStop.get()) {
+	                        break;
+	                    }
+	                    
 	                    int slotIndex = (currentIndex + i) % slotArray.length;
 	                    Fkj slot = slotArray[slotIndex];
 	                    if (slot != null) {
 	                        String hasCard = slot.getHasCard();
 	                        int slotNumber = slotIndex + 1;
-	                        Long lastQueryTime = lastQueryTimeMap.get(slotNumber);
 
-	                        // 鏂板锛氬鏋滄湁浜鸿劯妫�娴嬶紝鍒欏彧鏌ヨ鏃犲崱鍗℃Ы
+	                        // 妫�鏌ユ槸鍚﹀洜涓轰汉鑴告娴嬮渶瑕佽烦杩囨湁鍗″崱妲�
 	                        if (ishaveface && "1".equals(hasCard)) {
-	                            // 璺宠繃鏈夊崱鍗℃Ы鐨勬煡璇�
+	                            // 璺宠繃鏈夊崱鍗℃Ы锛岀珛鍗崇户缁笅涓�涓紝涓嶇瓑寰�
 	                            if (DEBUG_ENABLED) {
 	                                debugBuilder.setLength(0);
 	                                debugBuilder.append("妫�娴嬪埌浜鸿劯锛岃烦杩囨湁鍗″崱妲� ").append(slotNumber).append(" 鐨勬煡璇n");
 	                                SystemDebugDialog.appendAsciiData(debugBuilder.toString());
 	                            }
-	                            continue;
+	                            continue; // 绔嬪嵆缁х画涓嬩竴涓崱妲斤紝涓嶇瓑寰�
 	                        }
 
-	                        // 纭畾鏌ヨ闂撮殧锛氬彧鏈塰asCard="1"鐨勫崱妲戒娇鐢�10绉掗棿闅旓紝鍏朵粬鎯呭喌锛堝寘鎷�"-1"锛夐兘浣跨敤100ms闂撮殧
-	                        int queryInterval = "1".equals(hasCard) ? HAS_CARD_QUERY_INTERVAL : NO_CARD_QUERY_INTERVAL;
+	                        // 鍙戦�佹煡璇㈡寚浠ゅ埌褰撳墠鍗℃Ы
+	                        boolean sendSuccess = sendQueryToSlot(slotNumber);
+	                        
+	                        if (sendSuccess) {
+	                            // 鏇存柊鏈�鍚庢煡璇㈡椂闂�
+	                            lastQueryTimeMap.put(slotNumber, System.currentTimeMillis());
+	                            consecutiveFailures = 0;
 
-	                        // 妫�鏌ユ槸鍚﹁揪鍒版煡璇㈡椂闂�
-	                        if (lastQueryTime == null || currentTime - lastQueryTime >= queryInterval) {
-	                            if (sendQueryToSlot(slotNumber)) {
-	                                // 鏇存柊鏈�鍚庢煡璇㈡椂闂�
-	                                lastQueryTimeMap.put(slotNumber, currentTime);
-	                                sentQuery = true;
-	                                consecutiveFailures = 0;
-
-	                                // 鎴愬姛鍙戦�佹煡璇㈠悗锛岀瓑寰�100ms鍐嶇户缁笅涓�涓煡璇�
-	                                Thread.sleep(100);
-
-	                                if (DEBUG_ENABLED) {
-	                                    String status;
-	                                    if ("1".equals(hasCard)) {
-	                                        status = "鏈夊崱";
-	                                    } else if ("-1".equals(hasCard)) {
-	                                        status = "鏈煡";
-	                                    } else {
-	                                        status = "鏃犲崱";
-	                                    }
-	                                    
-	                                    // 浣跨敤閲嶇敤鐨� StringBuilder 鏋勫缓璋冭瘯淇℃伅
-	                                    debugBuilder.setLength(0);
-	                                    debugBuilder.append("Slot ").append(slotNumber)
-	                                               .append(" (").append(status).append(") 鏌ヨ鎴愬姛锛岄棿闅�: ")
-	                                               .append(queryInterval).append("ms\n");
-	                                    SystemDebugDialog.appendAsciiData(debugBuilder.toString());
+	                            if (DEBUG_ENABLED) {
+	                                String status;
+	                                if ("1".equals(hasCard)) {
+	                                    status = "鏈夊崱";
+	                                } else if ("-1".equals(hasCard)) {
+	                                    status = "鏈煡";
+	                                } else {
+	                                    status = "鏃犲崱";
 	                                }
-	                            } else {
-	                                consecutiveFailures++;
-	                                if (consecutiveFailures >= MAX_CONSECUTIVE_FAILURES) {
-	                                    logErrorWithRateLimit("consecutive_failures", "lunxun杩炵画澶辫触娆℃暟杩囧锛屾殏鍋滆疆璇�");
-	                                    pausePolling();
-	                                    break;
-	                                }
+	                                
+	                                debugBuilder.setLength(0);
+	                                debugBuilder.append("Slot ").append(slotNumber)
+	                                           .append(" (").append(status).append(") 鏌ヨ鎴愬姛\n");
+	                                SystemDebugDialog.appendAsciiData(debugBuilder.toString());
+	                            }
+	                        } else {
+	                            consecutiveFailures++;
+	                            if (consecutiveFailures >= MAX_CONSECUTIVE_FAILURES) {
+	                                logErrorWithRateLimit("consecutive_failures", "lunxun杩炵画澶辫触娆℃暟杩囧锛屾殏鍋滆疆璇�");
+	                                pausePolling();
+	                                break;
 	                            }
 	                        }
+
+	                        // 鍙戦�佹煡璇㈡寚浠ゅ悗绛夊緟50ms锛岀劧鍚庣户缁笅涓�涓崱妲�
+	                        Thread.sleep(50);
 	                    }
 	                }
 
 	                // 鏇存柊褰撳墠绱㈠紩
 	                currentIndex = (currentIndex + 1) % slotArray.length;
 
-	                // 濡傛灉娌℃湁鍙戦�佹煡璇紝绛夊緟涓�娈垫椂闂村啀缁х画
-	                if (!sentQuery) {
-	                    Thread.sleep(pollingInterval);
-	                }
-
 	            } catch (InterruptedException e) {
 	                //System.out.println("杞鏌ヨ绾跨▼琚腑鏂�");
 	                Thread.currentThread().interrupt();
@@ -527,45 +514,49 @@
 		 * 鍚戞寚瀹氬崱妲藉彂閫佹煡璇㈡寚浠� - 浼樺寲鐗堟湰
 		 * 浣跨敤缂撳瓨鎸囦护锛屼紭鍖栬皟璇曡緭鍑�
 		 */
-		private boolean sendQueryToSlot(int slotNumber) {
-			try {
-				// 浣跨敤缂撳瓨鐨勬煡璇㈡寚浠�            	
-				String queryCommand = getCachedQueryCommand(slotNumber);
-//				 System.out.println("鎸囦护鏄細"+queryCommand);
-				if (DEBUG_ENABLED) {
-					SystemDebugDialog.appendAsciiData("send to "+slotNumber+" queryCommand");
-				}
+		/**
+	     * 鍚戞寚瀹氬崱妲藉彂閫佹煡璇㈡寚浠� - 浼樺寲鐗堟湰
+	     * 浣跨敤缂撳瓨鎸囦护锛屼紭鍖栬皟璇曡緭鍑�
+	     */
+	    private boolean sendQueryToSlot(int slotNumber) {
+	        try {
+	            // 浣跨敤缂撳瓨鐨勬煡璇㈡寚浠�            	
+	            String queryCommand = getCachedQueryCommand(slotNumber);
+	            System.out.println(slotNumber+"鍙戦�佷簡鎸囦护鏄細"+queryCommand+"鏃堕棿"+TimestampUtil.getTimestamp());
+	            
+	            if (DEBUG_ENABLED) {
+	                SystemDebugDialog.appendAsciiData("send to "+slotNumber+" queryCommand");
+	            }
 
-				if (queryCommand != null && !queryCommand.trim().isEmpty()) {
-					// 鍙戦�佸埌涓插彛
+	            if (queryCommand != null && !queryCommand.trim().isEmpty()) {
+	                // 鍙戦�佸埌涓插彛
+	                if(sendChaxunzhiling) {
+	                    boolean sendResult = Sendmsg.sendMessage(queryCommand);
+	                    if (sendResult) {
+	                        return true;
+	                    } else {
+	                        if (DEBUG_ENABLED) {
+	                            SystemDebugDialog.appendAsciiData(slotNumber+" Send query command to card slot err");
+	                        }
+	                        // 鍙戦�佸け璐ュ彲鑳芥槸涓插彛鏂紑锛屾洿鏂拌繛鎺ョ姸鎬�
+	                        serialConnected = false;
+	                        return false;
+	                    }
+	                } else {
+	                    return false;
+	                }
+	            } else {
+	                logErrorWithRateLimit("empty_query_command", "鐢熸垚鐨勬煡璇㈡寚浠や负绌猴紝鍗℃Ы: " + slotNumber);
+	                return false;
+	            }
 
-					if(sendChaxunzhiling) {
-						boolean sendResult = Sendmsg.sendMessage(queryCommand);
-						if (sendResult) {
-							return true;
-						} else {
-							if (DEBUG_ENABLED) {
-								SystemDebugDialog.appendAsciiData(slotNumber+" Send query command to card slot err");
-							}
-							// 鍙戦�佸け璐ュ彲鑳芥槸涓插彛鏂紑锛屾洿鏂拌繛鎺ョ姸鎬�
-							serialConnected = false;
-							return false;
-						}
-					}else {
-						return false;
-					}
-				} else {
-					logErrorWithRateLimit("empty_query_command", "鐢熸垚鐨勬煡璇㈡寚浠や负绌猴紝鍗℃Ы: " + slotNumber);
-					return false;
-				}
-
-			} catch (Exception e) {
-				logErrorWithRateLimit("send_query_exception", "鍙戦�佹煡璇㈡寚浠ゅ埌鍗℃Ы " + slotNumber + " 鏃跺彂鐢熷紓甯�: " + e.getMessage());
-				// 鍙戠敓寮傚父鏃舵洿鏂颁覆鍙h繛鎺ョ姸鎬�
-				serialConnected = false;
-				return false;
-			}
-		}
+	        } catch (Exception e) {
+	            logErrorWithRateLimit("send_query_exception", "鍙戦�佹煡璇㈡寚浠ゅ埌鍗℃Ы " + slotNumber + " 鏃跺彂鐢熷紓甯�: " + e.getMessage());
+	            // 鍙戠敓寮傚父鏃舵洿鏂颁覆鍙h繛鎺ョ姸鎬�
+	            serialConnected = false;
+	            return false;
+	        }
+	    }
 	}
 
 	/**
diff --git a/src/home/CardMachineUI.java b/src/home/CardMachineUI.java
index 2caf8e5..831171c 100644
--- a/src/home/CardMachineUI.java
+++ b/src/home/CardMachineUI.java
@@ -481,14 +481,22 @@
 	        final int slotId = i;
 	        SlotStatus status = getSlotStatusFromManager(slotId);
 	        
-	        // 娣诲姞璋冭瘯淇℃伅
+	        // 鑾峰彇鍗℃Ы淇℃伅
 	        Fkj slotInfo = slotManager.getSlotInfo(slotId);
-	        if (slotInfo != null) {
-	        } else {
-	            System.err.println("鍗℃Ы " + slotId + " - 鑾峰彇淇℃伅澶辫触");
+	        String cardNumber = "鏃犲崱";
+	        if (slotInfo != null && slotInfo.getCardNumber() != null) {
+	            String cardNum = slotInfo.getCardNumber();
+	            // 鍒ゆ柇鍗″彿鏄惁鏈夋晥锛堜笉鏄�"-1"鎴�"0000"锛�
+	            if (!"-1".equals(cardNum) && !"0000".equals(cardNum)) {
+	                cardNumber = cardNum;
+	            }
 	        }
 
-	        JButton slotButton = new JButton(String.valueOf(slotId));
+	        // 鍒涘缓鍖呭惈鍗℃Ы缂栧彿鍜屽崱鍙风殑HTML鏂囨湰
+	        String buttonText = String.format("<html><div style='text-align: center;'>%d<br/><span style='font-size: 10px;'>%s</span></div></html>", 
+	                                         slotId, cardNumber);
+	        
+	        JButton slotButton = new JButton(buttonText);
 	        slotButton.setBackground(status.getColor());
 	        slotButton.setForeground(Color.WHITE);
 	        slotButton.setFont(new Font("Microsoft YaHei", Font.BOLD, 14));
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