2013-03-21 62 views
1

我有一个代码下面,我发送到串行USB端口... 它正在工作,现在它不是! 的akber()功能死去如果错误的字符串发送...Java写入字节到串口USB

如果我送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)); 

我需要它来处理“数据”字符串中任意数字的组合,因此它将它们转换为正确的字节类型并写入端口...它不是我的代码,牛逼很理解,但仍需要修复它:-)

+1

你说'akber()函数死了'是什么意思?有没有堆栈跟踪? – linski 2013-03-21 11:08:44

+0

如果我做System.out.println(“akberData =”+ akber(“1.0.2.0.0.5”));它返回akberData = [B @ 101e178 ...如果我做System.out.println(“akberData =”+ akber(“1.0.128.0.0.5”)); 它返回null,并且该函数在该点处停止。 ...实际上,它似乎超过128的值,如果低于128,函数不会返回任何结果...? – user2194607 2013-03-21 11:20:18

回答

1

改变这一行:

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

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

我跑你的代码,原来它抛出一个IndexOutOfBo undsException为

akber("1.0.128.0.0.5"); 

因此请检查您的代码是否在某处使用异常,

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

如果exceptionThrowingMethod抛出异常的代码会继续,如果异常被抛出不(但exceptionThrowingMethod没有成功地执行!)

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解决方案。 谢谢。