0

Androidのライブラリを使用してターミナルエミュレータに接続しています。これはシリアルデバイス(スイッチ)に接続し、送受信されたデータを表示します。別のライブラリを使用してシリアルでデータを送信します。どちらの場合も、端末の下にあるテキストボックスを介して、または端末自体を入力してキーボードのEnterキーを押すことにより、接続を介してデータを送信します。ボタンを押してコマンドを送信することもできます。

私のアクティビティでsendOverSerialは、ライブラリメソッドを呼び出すだけのメソッドを使用して、USB経由でシリアル接続されたデバイスにデータを送信しています。

public static void sendOverSerial(byte[] data) {

        if(mSelectedAdapter !=null && data !=null){
        mSelectedAdapter.sendData(data);

      }}

このアクティビティは、クラスのインスタンスを開きます。このクラスは、端末画面にデータを書き込むために使用されます。一般に、シリアルを介してデータを送信する場合は、アクティビティでメソッドをeditText呼び出しbuttonsます。sendOverSerialしかし、私が端末自体に文字を書き込んでいるとき、それらはこの新しいインスタンスwriteメソッドで取得されます。sendOverSerialそのため、そのインスタンスからメソッドを呼び出す必要があります。私の問題は、以下に「TEST」と書くためにそれを呼び出すと、TESTが無限ループで端末に書き込まれ、それが書き込みを続けることです。なぜですか?コメントしたようにさらに下に送信すると、期待どおりに1回だけ送信されます。

 public void write(byte[] bytes, int offset, int count) {

            int numCRs = 0;
            for (int i = offset; i < offset + count; ++i) {
                if (bytes[i] == '\r') {
                    ++numCRs;
                }
            }

            if (numCRs == 0) {
                // No CRs -- just send data as-is

                //infinite loop if I send from here
                GraphicsTerminalActivity.sendOverSerial("TEST".getBytes());

                super.write(bytes, offset, count);

                if (isRunning()) {
                   doLocalEcho(bytes);
                }
                return;
            }

            Log.d(TAG, "CRs=== " + numCRs);
            // Convert CRs into CRLFs
            byte[] translated = new byte[count + numCRs];
            int j = 0;
            for (int i = offset; i < offset + count; ++i) {
                if (bytes[i] == '\r') {
                    translated[j++] = '\r';
                    translated[j++] = '\n';
                } else {
                    translated[j++] = bytes[i];
                }
            }
           //fine if I send from here, sends once
            GraphicsTerminalActivity.sendOverSerial("SECOND TEST".getBytes());
           super.write(translated, 0, translated.length);

            // If server echo is off, echo the entered characters locally
            if (isRunning()) {
                doLocalEcho(translated);
            }                            
        }

ライブラリからのSuper.write:

 public void write(byte[] data, int offset, int count) {
        try {
            mWriteQueue.write(data, offset, count);
        } catch (InterruptedException e) {
        }
        notifyNewOutput();
    }

次に、ライブラリ内の別のクラスであるバイトキュークラスでwriteを呼び出します。

public void write(byte[] buffer, int offset, int length)
    throws InterruptedException {
        if (length + offset > buffer.length) {
            throw
                new IllegalArgumentException("length + offset > buffer.length");
        }
        if (length < 0) {
            throw
            new IllegalArgumentException("length < 0");

        }
        if (length == 0) {
            return;
        }
        synchronized(this) {
            int bufferLength = mBuffer.length;
            boolean wasEmpty = mStoredBytes == 0;
            while (length > 0) {
                while(bufferLength == mStoredBytes) {
                    wait();
                }
                int tail = mHead + mStoredBytes;
                int oneRun;
                if (tail >= bufferLength) {
                    tail = tail - bufferLength;
                    oneRun = mHead - tail;
                } else {
                    oneRun = bufferLength - tail;
                }
                int bytesToCopy = Math.min(oneRun, length);
                System.arraycopy(buffer, offset, mBuffer, tail, bytesToCopy);
                offset += bytesToCopy;
                mStoredBytes += bytesToCopy;
                length -= bytesToCopy;
            }
            if (wasEmpty) {
                notify();
            }
        }
    }
4

1 に答える 1

0

データが送信されているときにメソッドが自動的に呼び出されていました。このメソッドには、書き込みなどの無限ループなどの呼び出しもありました。

于 2013-01-22T15:46:38.220 に答える