张世豪
5 小时以前 100f4dcea20a32663a07e91525de111f7515eb79
src/publicway/SerialProtocolParser.java
@@ -5,7 +5,13 @@
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import chuankou.SerialPortService;
import chushihua.SlotManager;
import chushihua.lunxun;
import dialog.Charulog;
import dialog.Dingshidialog;
import publicway.ProtocolParser01.ParseResult;
import xitongshezhi.SystemDebugDialog;
public class SerialProtocolParser {
    
@@ -45,7 +51,7 @@
     */
    public void start() {
        if (isRunning) {
            System.out.println("串口协议解析器已经在运行中");
            //System.out.println("串口协议解析器已经在运行中");
            return;
        }
        
@@ -58,7 +64,7 @@
        processorThread.setDaemon(true);
        processorThread.start();
        
        System.out.println("串口协议解析器已启动");
        //System.out.println("串口协议解析器已启动 - 独立于轮询状态运行");
    }
    
    /**
@@ -97,7 +103,7 @@
        batchQueue.clear();
        bufferPosition = 0;
        
        System.out.println("串口协议解析器已停止");
        //System.out.println("串口协议解析器已停止");
    }
    
    /**
@@ -112,15 +118,15 @@
     */
    public void receiveData(byte[] rawData) {       
        if (!isRunning) {
            System.out.println("警告: 串口协议解析器未启动,忽略接收的数据");
            return;
            // 如果解析器未运行,自动启动
            start();
        }
        
        if (rawData == null || rawData.length == 0) {
            return;
        }
        
        // 将数据添加到批量队列
        // 将数据添加到批量队列 - 确保始终执行
        if (!batchQueue.offer(rawData)) {
            System.err.println("批量队列已满,丢弃数据");
        }
@@ -166,7 +172,7 @@
        long maxMem = runtime.maxMemory();
        
        if (usedMem > maxMem * 0.8) {
            System.out.println("内存使用率超过80%,当前使用: " + (usedMem / 1024 / 1024) + "MB");
            //System.out.println("内存使用率超过80%,当前使用: " + (usedMem / 1024 / 1024) + "MB");
        }
    }
    
@@ -273,11 +279,11 @@
     */
    private void parsePacket(byte[] packet) {
        try {
           SerialPortService.getReceivedDataCount();
            // 解析基本字段
            byte hostAddress = packet[4];        // 主机地址
            byte slotAddress = packet[5];        // 卡槽地址
            byte functionCode = packet[6];       // 功能码
            byte functionCode = packet[6];       // 功能码
            // 数据长度 (从协议中读取)
            int dataLength = ((packet[2] & 0xFF) << 8) | (packet[3] & 0xFF);
            
@@ -296,33 +302,40 @@
                        // 使用优化的字节数组解析方法,避免字符串转换
                        ParseResult rst = ProtocolParser01.parseDDCC01Data(packet);
                        rst.fuzhi();
                        rst.toString();
//                        System.out.println(rst.toString());
                        if (lunxun.DEBUG_ENABLED) {
                            SystemDebugDialog.appendAsciiData(rst.toString());
                        }
                    }
                    break;
                case FUNCTION_51:
                    // 调用 ProtocolParser51 处理数据
                    String hexPacket = bytesToHex(packet);
                    int result = ProtocolParser51.parse(hexPacket);
                    int slot = slotAddress;
                    if (result == 1) {
                        System.out.println("功能码 0x51 - 开门控制成功");
//                       Dingshidialog.showTimedDialog(null, 5,slot+"号卡槽出卡成功请取走卡...");
                       SlotManager.changgehaska(slot, result);
                    } else {
                        System.out.println("功能码 0x51 - 开门控制失败或报文不合法");
                       String message=slot+"号卡槽取卡失败";
                        Charulog.logOperation(message);
                    }
                    break;
                case FUNCTION_52:
                    System.out.println("功能码 0x52 - LED亮度控制");
                    //System.out.println("功能码 0x52 - LED亮度控制");
                    break;
                case FUNCTION_80:
                    System.out.println("功能码 0x80 - 工卡升级使能");
                    //System.out.println("功能码 0x80 - 工卡升级使能");
                    break;
                case FUNCTION_81:
                    System.out.println("功能码 0x81 - 工作卡升级数据包");
                    //System.out.println("功能码 0x81 - 工作卡升级数据包");
                    break;
                case FUNCTION_82:
                    System.out.println("功能码 0x82 - 单板升级使能");
                    //System.out.println("功能码 0x82 - 单板升级使能");
                    break;
                case FUNCTION_83:
                    System.out.println("功能码 0x83 - 单板升级数据包");
                    //System.out.println("功能码 0x83 - 单板升级数据包");
                    break;
                default:
                    System.err.println("未知功能码: 0x" + Integer.toHexString(functionCode & 0xFF));