我有一个代码,我发送到串行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));
我需要它在“数据”字符串中使用任何数字组合,因此它将它们转换为正确的字节类型并写入端口...它不是我的代码,我不太明白它,但仍然需要解决它: - )
答案 0 :(得分:1)
更改此行:
if (x<256) { space++; } else { space+=2; }
到
if (x<128) { space++; } else { space+=2; }
我运行了你的代码,最初它会为
抛出一个IndexOutOfBoundsExceptionakber("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解决方案,因为我更习惯于编写脚本。 感谢。