0

java-simple-serial-connector API を使用してシリアル ポートの読み取りと書き込みを行うアプリケーションを開発しています。データ バイトを読み取ってグローバル文字列変数 (sReader) に割り当てようとすると、問題が発生します。sReader は文字列全体を取得するわけではなく、その長さは毎回ランダムです。文字列 sBuffer を出力 (Output.append) に追加すると、文字列全体が常に表示されるため、すべてのバイトを受信して​​いると確信しています。以下の私のサンプルコードを見てください:

public class SerialPortTest extends javax.swing.JFrame {

    private String sReader = "";
    private JTextArea outputTextArea;
    private JLabel outputLabel;

    private class Reader implements SerialPortEventListener {

        private String sBuffer = "";

        @Override
        public void serialEvent(SerialPortEvent spe) {

            if (spe.isRXCHAR() || spe.isRXFLAG()) {

                if (spe.getEventValue() > 0) {

                    try {

                        //Read chars from buffer
                        byte[] bBuffer = serialPort.readBytes(spe.getEventValue());
                        sBuffer = new String(bBuffer);

                        SwingUtilities.invokeAndWait(
                                new Runnable() {

                                    @Override
                                    public void run() {

                                        sReader = sBuffer;//does not assign full string

                                        outputLabel.setText(sBuffer);//does not set full string

                                        outputTextArea.setText(sBuffer);//does not set full string

                                        outputTextArea.append(sBuffer);//This works! Why the above don't work?

                                    }
                                });

                    } catch (SerialPortException | InterruptedException | InvocationTargetException ex) {
                    }
                }
            }
        }
    }
}
4

1 に答える 1

1

コードの他の部分からsReaderにアクセスしたいとします。その場合は、sReaderを揮発性にし、Runnableを作成する前に割り当てることを検討してください。また、sBufferがRunnableで使用する文字列を作成するためにのみ使用される場合は、それを最終的なローカル変数にすることを検討してください。

private volatile String sReader = "";
...

final String sBuffer = new String(bBuffer);
sReader = sBuffer;

SwingUtilities.invokeAndWait(
...
于 2012-02-28T21:28:25.470 に答える