有没有人能帮我解释一下,为什么我的val值是"0",Integer.parseInt(val)会返回NumberFormatException,如果我写的是Integer.parseInt("0"),它就能正常工作……
有一种更简单的方法可以直接使用从Serial读取的int值吗?
void draw(){
i=0;
byte[] str = new byte[5];
if ( myPort.available() > 0)
{
myPort.readBytesUntil(10, inBuffer);
if(inBuffer==null){
//...
}
else
{
while(inBuffer[i]!=13){
str[i]=inBuffer[i];
println((int)str[i]);
i++;
}
String val = new String(str);
i = Integer.parseInt(val);
println(i);
}
}
}发布于 2014-12-22 23:46:29
在处理过程中,port.readBytesUntil(ch, buffer)从port读取所有字符,直到遇到等于ch的字符。在Windows中,行分隔符由2个字符(0d,0a)或(13,10)组成。
因此,如果您写入串行"23"、下一个换行符、下一个"45"等,buffer将如下所示:
char[] buffer : '2', '3', '0x0d', '0x0a', '4', '5', '0x0d', '0x0a', ...因此,当您readBytesUntil(10, ...)它时,读取3个字符:'2', '3', '0x0d'。
考虑这样的例子:
char[] c = {'2', '3', 13};
String str = new String(c);
System.out.println(str); // you will see "23"
System.out.println(str.length()); // lenght will be 3
System.out.println(Integer.parseInt(str.trim())); // will be OK
System.out.println(Integer.parseInt(str)); // will throw NumberFormatException因此,尝试将缓冲区转换为字符串,并对此字符串执行trim()操作。
==编辑==
处理为您提供了一些方便的方法,例如:
String str = port.readStringUntil(10);
str = str.trim();发布于 2014-12-22 22:48:55
您能提供一个演示该问题的MCVE吗?使用硬编码的值并使其尽可能简单,如下所示:
void setup(){
String val = "0";
int i = Integer.parseInt(val);
println(i);
}在尝试解析val之前,先打印出val的值。我敢打赌,它的价值不是你想的那样。
https://stackoverflow.com/questions/27604918
复制相似问题