Java将字节写入串口USB

时间:2013-03-21 10:40:46

标签: java byte usbserial

我有一个代码,我发送到串行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));

我需要它在“数据”字符串中使用任何数字组合,因此它将它们转换为正确的字节类型并写入端口...它不是我的代码,我不太明白它,但仍然需要解决它: - )

2 个答案:

答案 0 :(得分: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没有成功执行!)

答案 1 :(得分: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解决方案,因为我更习惯于编写脚本。 感谢。