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 硬件接收到不正确的字符并且不工作...通过查看stackoverflow上有关“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 回答