| | |
| | | package chuankou; |
| | | |
| | | import com.fazecast.jSerialComm.SerialPort; |
| | | |
| | | import java.io.ByteArrayOutputStream; |
| | | import java.io.InputStream; |
| | | import java.io.OutputStream; |
| | | import java.util.function.Consumer; |
| | | // import java.util.function.Consumer; |
| | | |
| | | import com.fazecast.jSerialComm.SerialPort; |
| | | |
| | | public class SerialPortService { |
| | | |
| | |
| | | private volatile boolean capturing = false; |
| | | private volatile boolean paused = true; |
| | | private Thread readerThread; |
| | | private Consumer<byte[]> responseConsumer; |
| | | private DataListener<byte[]> responseConsumer; |
| | | |
| | | // 优化:重用缓冲区,减少内存分配 |
| | | private byte[] readBuffer = new byte[200]; |
| | | private ByteArrayOutputStream buffer = new ByteArrayOutputStream(1024); |
| | | private Consumer<byte[]> dataReceivedCallback; |
| | | private DataListener<byte[]> dataReceivedCallback; |
| | | |
| | | |
| | | // 新增:数据条数计数器 |
| | |
| | | if (dataReceivedCallback != null) { |
| | | startCapture(dataReceivedCallback); |
| | | } else { |
| | | System.err.println("No data received callback set. Please call startCapture(Consumer<byte[]> onReceived) first."); |
| | | System.err.println("No data received callback set. Please call startCapture(DataListener<byte[]> onReceived) first."); |
| | | } |
| | | } |
| | | |
| | |
| | | return port.openPort(); |
| | | } |
| | | |
| | | public void setResponseConsumer(Consumer<byte[]> consumer) { |
| | | public void setResponseConsumer(DataListener<byte[]> consumer) { |
| | | this.responseConsumer = consumer; |
| | | } |
| | | |
| | |
| | | /** |
| | | * 启动数据接收线程 |
| | | */ |
| | | public void startCapture(Consumer<byte[]> onReceived) { |
| | | public void startCapture(DataListener<byte[]> onReceived) { |
| | | this.dataReceivedCallback = onReceived; |
| | | if (capturing || port == null || !port.isOpen()) return; |
| | | capturing = true; |
| | | paused = false; |
| | | |
| | | readerThread = new Thread(() -> { |
| | | readerThread = new Thread(new Runnable() { |
| | | @Override |
| | | public void run() { |
| | | buffer.reset(); |
| | | long lastReceivedTime = 0; |
| | | |
| | |
| | | responseConsumer.accept(data); |
| | | } |
| | | } |
| | | }); |
| | | } }); |
| | | readerThread.setDaemon(true); |
| | | readerThread.start(); |
| | | } |