0

私のプロジェクトでは、PC とマイクロコントローラーをリンクするためにJSSCライブラリを使用しました。

書き込み方法:

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;
    }
}

ポートへの同期書き込み (データをすぐに送信) と、ポートからの非同期読み取り (少なくとも 1000 ミリ秒の入力データを待機) を実装しようとしました。

正しい判断ですか?たぶん、非同期データ読み取りの他の方法がありますか?

ありがとうございました!

4

1 に答える 1

0

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.
                    }
                  }
于 2016-02-29T13:33:56.450 に答える