2

ここにコードスニペットがあります

ここで私はアクションリスナーを開始しています

    try {

        port_seleted.addEventListener(this);

    } catch (TooManyListenersException e) {
        System.out.println("too many Listeners!");
    }

    port_seleted.notifyOnDataAvailable(true);

ここでは、データを受信すると以下のメソッドが呼び出されます

public void serialEvent(SerialPortEvent Ack_Rec) {

    boolean first_flash = false;

    if (Ack_Rec.getEventType() == SerialPortEvent.DATA_AVAILABLE) {

        try {

            while (input_data.available() > 0) {
                input_data.read(rec_ack);
            }
        } catch (IOException e) {
            System.out.println("IO Exception in SerialEvent");
        }

データを正しく受信していません。

「Hello How are you doing today」というデータを送信すると、「Hello h」「ow」「are you」「doin」「g today」として受信されます。

つまり、Serial イベント メソッドが複数回呼び出されています。つまり、完全なデータが読み取られる前に while ループを終了しています。

遅延を挿入すると

    try {

            while (input_data.available() > 0) {
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                input_data.read(rec_ack);
            }
        } catch (IOException e) {
            System.out.println("IO Exception in SerialEvent");
        }

上記のとおり、問題なく動作しています。効率が低下しているため、遅延を取り除く方法を教えてください!

4

2 に答える 2

-1

のカウントに基づいてのみ使用可能なバイト数を読み取りますinput_data.available()

int bytesAvailable = 0;
while ((bytesAvailable=input_data.available()) > 0) {


                input_data.read(rec_ack,0,bytesAvailable);
            }
        } catch (IOException e) {
            System.out.println("IO Exception in SerialEvent");
        }
于 2013-02-07T05:23:17.227 に答える