1

以下に、シリアル USB ポートに送信するコードを示します...動作していましたが、動作しません! 間違った文字列が送信された場合、akber()関数は終了します...

私が送信した場合akber("1.0.0.0.1.5")- それは完全に動作します,

送信akber("23.0.128.0.0.5")しても機能しません...

以下のコードを参照してください

    public static byte[] akber(final String input) {
        StringTokenizer tokens = new StringTokenizer(input, ".");
        int numberOfArrays = tokens.countTokens();
        byte[][] byteArrays;
        byteArrays = new byte[numberOfArrays][4];
        int i = 0;
        int space = 0;
        while (tokens.hasMoreTokens()) {
            int x = Integer.valueOf(tokens.nextToken());
            if (x<256) { space++; } else { space+=2; }  
            byteArrays[i] = BigInteger.valueOf(x).toByteArray();
            i++;
        }
        final byte[] output = new byte[space];
        copySmallArraysToBigArray(byteArrays, output);
        return output;
    }

    public static void copySmallArraysToBigArray(final byte[][] smallArrays, final byte[] bigArray) {
        int currentOffset = 0;
        for (final byte[] currentArray : smallArrays) {
            System.arraycopy(currentArray, 0, bigArray, currentOffset, currentArray.length);
            currentOffset += currentArray.length;
        }
}

関数から呼び出されます:

serialPort.writeBytes(akber(data));

「データ」文字列の数字の任意の組み合わせで動作する必要があるため、それらを正しいタイプのバイトに変換し、ポートに書き込みます...それは私のコードではなく、よくわかりませんが、まだ修正する必要があります:-)

4

2 に答える 2

1

この行を変更します。

if (x<256) { space++; } else { space+=2; }  

if (x<128) { space++; } else { space+=2; }  

私はあなたのコードを実行しましたが、元々は IndexOutOfBoundsException をスローします

akber("1.0.128.0.0.5");

コードをチェックして、どこかで例外を消費していないことを確認してください。

try {
     exceptionThrowingMethod();
}      
catch(Exception e) {
}

が例外をスローした場合exceptionThrowingMethod、コードは例外がスローされなかったかのように続行します (ただし、は正常にexceptionThrowingMethod実行されませんでした!)

于 2013-03-21T12:57:09.030 に答える
0

実際には、上記によりコードは引き続き機能することができましたが、128 を超える関数からのバイト値が負の等価物または何かであり、間違った値を送信したため、問題は解決しませんでした。そのため、USB ハードウェアは間違った文字を受信し、機能しませんでした。 ...スタックオーバーフローの「Java 128バイト」に関する他の投稿を見て、128を超えるバイトコードがその負の同等物と同じであることを解決したので、試行錯誤で解決し、非常に面倒でしたが、その行を変更しましたに:

    if (x<128) { space++; } else { space+=2;
                int x2 = (x-128)*2;
                x=x-(x*2);
                if (x<-128) { x=x+x2; }
                }

うまくいったようです。別の問題が見つかるまで、とても幸せな日々です! 127を超える値をバイトに変換しようとしている人にとっては、スクリプトに慣れているため、私が見たが実際には理解していなかった標準的なJavaソリューションよりも簡単なソリューションかもしれません。ありがとう。

于 2013-03-22T00:53:59.650 に答える