| | |
| | | * 启动数据接收线程 |
| | | */ |
| | | public void startCapture(Consumer<byte[]> onReceived) { |
| | | this.dataReceivedCallback = onReceived; |
| | | if (capturing || port == null || !port.isOpen()) return; |
| | | capturing = true; |
| | | paused = false; |
| | | this.dataReceivedCallback = onReceived; |
| | | if (capturing || port == null || !port.isOpen()) return; |
| | | capturing = true; |
| | | paused = false; |
| | | |
| | | readerThread = new Thread(() -> { |
| | | buffer.reset(); |
| | | long lastReceivedTime = 0; |
| | | readerThread = new Thread(() -> { |
| | | buffer.reset(); |
| | | long lastReceivedTime = 0; |
| | | |
| | | while (capturing && port.isOpen()) { |
| | | long currentTime = System.currentTimeMillis(); |
| | | while (capturing && port.isOpen()) { |
| | | long currentTime = System.currentTimeMillis(); |
| | | |
| | | if (buffer.size() > 0 && (currentTime - lastReceivedTime) >= 20) { |
| | | byte[] data = buffer.toByteArray(); |
| | | SystemDebugDialog.appendHexData(data); |
| | | if (buffer.size() > 0 && (currentTime - lastReceivedTime) >= 20) { |
| | | byte[] data = buffer.toByteArray(); |
| | | SystemDebugDialog.appendHexData(data); |
| | | |
| | | // 新增:将数据传递给协议解析器 |
| | | if (protocolParser != null) { |
| | | protocolParser.receiveData(data); |
| | | } |
| | | // 新增:将数据传递给协议解析器 - 确保始终执行 |
| | | if (protocolParser != null) { |
| | | protocolParser.receiveData(data); |
| | | } |
| | | |
| | | if (!paused) { |
| | | onReceived.accept(data); |
| | | if (responseConsumer != null) { |
| | | responseConsumer.accept(data); |
| | | } |
| | | } |
| | | buffer.reset(); |
| | | } |
| | | // 确保数据回调始终执行,不受暂停状态影响 |
| | | if (dataReceivedCallback != null && !paused) { |
| | | dataReceivedCallback.accept(data); |
| | | } |
| | | if (responseConsumer != null && !paused) { |
| | | responseConsumer.accept(data); |
| | | } |
| | | buffer.reset(); |
| | | } |
| | | |
| | | int len = port.readBytes(readBuffer, readBuffer.length); |
| | | currentTime = System.currentTimeMillis(); |
| | | int len = port.readBytes(readBuffer, readBuffer.length); |
| | | currentTime = System.currentTimeMillis(); |
| | | |
| | | if (len > 0) { |
| | | buffer.write(readBuffer, 0, len); |
| | | lastReceivedTime = currentTime; |
| | | } |
| | | if (len > 0) { |
| | | buffer.write(readBuffer, 0, len); |
| | | lastReceivedTime = currentTime; |
| | | } |
| | | |
| | | if (len <= 0 && buffer.size() == 0) { |
| | | try { Thread.sleep(1); } catch (InterruptedException ignore) {} |
| | | } |
| | | } |
| | | if (len <= 0 && buffer.size() == 0) { |
| | | try { Thread.sleep(1); } catch (InterruptedException ignore) {} |
| | | } |
| | | } |
| | | |
| | | if (buffer.size() > 0) { |
| | | byte[] data = buffer.toByteArray(); |
| | | SystemDebugDialog.appendHexData(data); |
| | | if (buffer.size() > 0) { |
| | | byte[] data = buffer.toByteArray(); |
| | | SystemDebugDialog.appendHexData(data); |
| | | |
| | | // 新增:将数据传递给协议解析器 |
| | | if (protocolParser != null) { |
| | | protocolParser.receiveData(data); |
| | | } |
| | | // 新增:将数据传递给协议解析器 - 确保始终执行 |
| | | if (protocolParser != null) { |
| | | protocolParser.receiveData(data); |
| | | } |
| | | |
| | | if (!paused) { |
| | | onReceived.accept(data); |
| | | if (responseConsumer != null) { |
| | | responseConsumer.accept(data); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | readerThread.setDaemon(true); |
| | | readerThread.start(); |
| | | // 确保数据回调始终执行,不受暂停状态影响 |
| | | if (dataReceivedCallback != null && !paused) { |
| | | dataReceivedCallback.accept(data); |
| | | } |
| | | if (responseConsumer != null && !paused) { |
| | | responseConsumer.accept(data); |
| | | } |
| | | } |
| | | }); |
| | | readerThread.setDaemon(true); |
| | | readerThread.start(); |
| | | } |
| | | // 新增:设置暂停状态但不影响协议解析器 |
| | | public void setPaused(boolean paused) { |
| | | this.paused = paused; |
| | | // 注意:不停止协议解析器,只暂停UI回调 |
| | | } |
| | | |
| | | // 新增:单独停止数据捕获而不影响协议解析器 |
| | | public void stopDataCaptureOnly() { |
| | | // 只停止数据回调,不影响协议解析器 |
| | | this.dataReceivedCallback = null; |
| | | this.responseConsumer = null; |
| | | } |
| | | /** |
| | | * 停止数据接收线程 |
| | | */ |
| | |
| | | } |
| | | } |
| | | |
| | | public void setPaused(boolean paused) { |
| | | this.paused = paused; |
| | | } |
| | | |
| | | public boolean isPaused() { |
| | | return paused; |