我正在尝试从串行端口读取 double 值。 我可以在 String 中读取它,但是当我将 String 解析为 Double 时,结果没有任何意义,并且与 String 不一样。
这是我的代码:
public void serialEvent(SerialPortEvent event){
switch(event.getEventType()) {
case SerialPortEvent.DATA_AVAILABLE:
byte[] readBuffer = new byte[8];
try {
while (inputStream.available()>0) {
int numBytes = inputStream.read(readBuffer);
String peso = new String (readBuffer, 0, numBytes, "UTF-8");
System.out.print(new String (readBuffer, 0, numBytes, "UTF-8"));
//double d = ByteBuffer.wrap(readBuffer).order(ByteOrder.LITTLE_ENDIAN ).getDouble();
//System.out.print(d);
m_dWeightBuffer = Double.parseDouble(peso);
System.out.print(m_dWeightBuffer);
}
//System.out.print(new String (readBuffer, 0, numBytes, "UTF-8"));
} catch (IOException ex) {}
break;
}
}
但是现在,您知道如何将此字符串转换为 Double 吗?
System.out.print(new String (readBuffer, 0, numBytes, "UTF-8"));
输出:000.250
好
m_dWeightBuffer = Double.parseDouble(peso);
System.out.print(m_dWeightBuffer);
输出:0.00.0250.0
不好
System.out.println(new String (readBuffer, 0, numBytes, "UTF-8"));
输出:
0
0
0
.250
最佳答案
前言
看来服务器正在串行端口上以 4 个 block 写入,可能是 64 位字:
- 0
- 0
- 0
- .250
您正在使用 64 位的最大缓冲区进行读取(readBuffer.length * 8 位),因此最后一个可能是:
0011111111010000000000000000000000000000000000000000000000000000
尝试一下:
String s = "0011111111010000000000000000000000000000000000000000000000000000";
double d = Double.longBitsToDouble(Long.parseLong(s,2));
System.out.println(d); //-> 0.25
目前没有什么问题。
回答
您可能希望在一个点中处理所有 4 个 block ,因此您可以尝试以下操作 - 当然,这在很大程度上取决于我忽略的协议(protocol)语义:
public void serialEvent(SerialPortEvent event){
switch(event.getEventType()) {
case SerialPortEvent.DATA_AVAILABLE:
byte[] readBuffer = new byte[8];
String peso = "";
try {
while (inputStream.available()>0) {
int numBytes = inputStream.read(readBuffer);
peso += new String (readBuffer, 0, numBytes, "UTF-8");
}
m_dWeightBuffer = Double.parseDouble(peso);
} catch (IOException ex) {}
break;
}
}
即在读取完所有数据后创建 double。
关于java - 从串口读取double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22781613/