[英]Java writing bytes to serial port USB
我下面有一个代码,我正在发送到串行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));
我需要它与“数据”字符串中的任何数字组合一起工作,因此它将其转换为正确的字节类型并写入端口...这不是我的代码,我不太理解,但是仍然需要修复它:-)
更改此行:
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
一样(但是exceptionThrowingMethod
没有成功执行!)
实际上,尽管上面的代码允许代码继续工作,但是它不能解决问题,因为来自函数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解决方案,因为它更习惯于编写脚本。 谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.