Java 从COM端口异步读取(使用JSSC lib)

Java 从COM端口异步读取(使用JSSC lib),java,asynchronous,serial-port,jssc,Java,Asynchronous,Serial Port,Jssc,我的项目使用库来连接PC和微控制器 写入方法: public void write(byte[] buffer) throws SerialPortException { if (serialPort.isOpened()) serialPort.writeBytes(buffer); } 读取方法: public byte[] read() throws SerialPortException { byte[] result = null; Fut

我的项目使用库来连接PC和微控制器

写入方法:

public void write(byte[] buffer) throws SerialPortException {
    if (serialPort.isOpened())
        serialPort.writeBytes(buffer);
}
读取方法:

public byte[] read() throws SerialPortException {

    byte[] result = null;

    FutureTask<byte[]> task = new FutureTask<>(new PortReader());
    ExecutorService executor = Executors.newSingleThreadExecutor();

    try {
        result = (byte[]) executor.submit(task).get(1000, TimeUnit.MILLISECONDS);
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    } catch (TimeoutException e) {
        System.err.println(getClass().getSimpleName() + " READ: Timeout exception!");
    }

    return result;
}

private class PortReader implements Callable<byte[]>, SerialPortEventListener {

    private byte[] data = null;

    @Override
    public void serialEvent(SerialPortEvent event) {

        if (event.isRXCHAR() && event.getEventValue() > 0) {
            try {
                data = serialPort.readBytes(event.getEventValue());
            } catch (SerialPortException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public byte[] call() throws Exception {
        if (data == null)
            Thread.sleep(200);

        return data;
    }
}
public byte[]read()抛出SerialPortException{
字节[]结果=空;
FutureTask task=newFutureTask(newPortReader());
ExecutorService executor=Executors.newSingleThreadExecutor();
试一试{
结果=(字节[])executor.submit(任务).get(1000,时间单位.毫秒);
}捕获(中断异常|执行异常e){
e、 printStackTrace();
}捕获(超时异常e){
System.err.println(getClass().getSimpleName()+“读取:超时异常!”);
}
返回结果;
}
私有类PortReader实现可调用的SerialPortEventListener{
专用字节[]数据=null;
@凌驾
public void serialEvent(SerialPortEvent事件){
if(event.isRXCHAR()&&event.getEventValue()>0){
试一试{
data=serialPort.readBytes(event.getEventValue());
}捕获(SerialPortException e){
e、 printStackTrace();
}
}
}
@凌驾
公共字节[]调用()引发异常{
如果(数据==null)
睡眠(200);
返回数据;
}
}
我试图实现对端口的同步写入(立即发送数据)和从端口的异步读取(等待输入数据至少1000毫秒)

这是正确的决定吗?也许还有其他异步数据读取方法


谢谢大家!

最好使用serialport类内部使用的等待事件。这种方式使端口等待命令执行完毕

serialPort.writeBytes(buffer);//Write data to port
serialPort.addEventListener(new PortReader(serialPort), SerialPort.MASK_RXCHAR);
int[][] eventArray=serialPort.waitEvents()
for (int i = 0; i < eventArray.length; i++) {
    if ((eventArray[i][0] > 0) ) {
     serialPort.eventListener.serialEvent(new SerialPortEvent("COM1", eventArray[i][0], eventArray[i][1])); //give your port name and the events got.
                    }
                  }
serialPort.writeBytes(缓冲区)//将数据写入端口
serialPort.addEventListener(新端口读取器(serialPort),serialPort.MASK_RXCHAR);
int[][]eventArray=serialPort.waitEvents()
for(int i=0;i0)){
serialPort.eventListener.serialEvent(新的SerialPortEvent(“COM1”,eventArray[i][0],eventArray[i][1]);//给出您的端口名和获得的事件。
}
}

很抱歉我的编辑中出现了错误的评论。在完成之前,我无意中按了enter键,无法再编辑该注释,因此我将在此处键入:“请仅对有关Microsoft“组件对象模型”的问题使用[com]标记。有关com串行端口的问题应改为使用[serial port]标记”。祝你好运