- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个导航单元,以 200 Hz 的频率发出 3 条消息,我试图按照发送的顺序捕获这些消息,并从这些消息中获取某些数据,并更新以字节形式串行发送的变量数组。
我使用套接字和输入流来获取数据,并将其传递到名为socketReader 的可运行类中。另一个可运行的类获取变量并进行一些数学运算,然后将它们转换为字节并串行发送出去。
该程序将一次运行约 8 小时,数据流将保持不变,但第三条消息(GPS 数据)除外,只有在有一条消息时才会发送。
InputStream in = echoSocket.getInputStream();
DataInputStream dis = new DataInputStream(in);
OutputStream out = serialPort.getOutputStream();
(new Thread(new SocketReader(dis))).start();
(new Thread(new SerialWriter(out))).start();
我遇到的问题是 socketReader 类。所以我知道十六进制的 header ,因此我将数据从 DataInputStream 读取到字节缓冲区并读取到 stringBuilder 中,在其中将数据放入更多子字符串并将它们转换为 float 。
这确实有效,你在解析 altHold logHold latHold 字符串时遇到了麻烦(并且被注释掉了)。它们不是 4 字节(单精度浮点)数据,而是 8 字节( double 浮点)数据。但我觉得我在这里重新发明了轮子。消息中的数据是最低有效位,我觉得我这样做会减慢我的程序速度?而且它并不完美,它会运行一段时间,然后退出循环。
目前我只查看其中两条消息,第三条消息的发送频率不如前两条消息。我应该使用 DataInputStream 以外的其他东西吗?
public static class SocketReader implements Runnable {
//Message headers
final String mes1 = new String("FF5A0600");
final String mes2 = new String("FF5A0800");
final String mes3 = new String("FF5A1300");
//These are the size of each message
final int Stop1 = 82;
final int Stop2 = 162;
final int Stop3 = 150;
StringBuilder rolHold = new StringBuilder();
StringBuilder pitHold = new StringBuilder();
StringBuilder yawHold = new StringBuilder();
StringBuilder altHold = new StringBuilder();
StringBuilder latHold = new StringBuilder();
StringBuilder logHold = new StringBuilder();
StringBuilder velNHold = new StringBuilder();
StringBuilder velEHold = new StringBuilder();
DataInputStream dis;
public SocketReader( DataInputStream dis ) {
this.dis = dis;
}
public void run() {
byte[] buffer;
//dis is a DataInputStream
while (dis != null){
buffer = new byte[ 1024 ];
try {
dis.readFully(buffer);
} catch (IOException e1) {
e1.printStackTrace();
}
StringBuilder sb = new StringBuilder();
for (byte b: buffer){
sb.append(String.format("%02X", b));
}
//Finds the first occurrence of the three messages
//If the index is -1 there is no occurrence
int index1 = sb.indexOf(mes1);
int index2 = sb.indexOf(mes2);
int index3 = sb.indexOf(mes3);
while (index1 <= sb.lastIndexOf(mes1) && (index1 != -1) && (index2 != -1) && (index2 != 0)){
//this if statement deals with the first message
//There are three sets of data pulled from message 1 {rolValue, pitValue, yawValue}
if (index1 < index2 && (index1 != -1)){
//reseting the Stringbuilders
rolHold.setLength(0);
pitHold.setLength(0);
yawHold.setLength(0);
//the data is sent little-endian and is appended in reverse order
rolHold.append(sb.substring((index1 + 26),(index1 + 28)));
rolHold.append(sb.substring((index1 + 24),(index1 + 26)));
rolHold.append(sb.substring((index1 + 22),(index1 + 24)));
rolHold.append(sb.substring((index1 + 20),(index1 + 22)));
Long rol = Long.parseLong(rolHold.toString(), 16);
rolValue = Float.intBitsToFloat(rol.intValue());
pitHold.append(sb.substring((index1 + 34),(index1 + 36)));
pitHold.append(sb.substring((index1 + 32),(index1 + 34)));
pitHold.append(sb.substring((index1 + 30),(index1 + 32)));
pitHold.append(sb.substring((index1 + 28),(index1 + 30)));
Long pit = Long.parseLong(pitHold.toString(), 16);
pitValue = Float.intBitsToFloat(pit.intValue());
yawHold.append(sb.substring((index1 + 42),(index1 + 44)));
yawHold.append(sb.substring((index1 + 40),(index1 + 42)));
yawHold.append(sb.substring((index1 + 38),(index1 + 40)));
yawHold.append(sb.substring((index1 + 36),(index1 + 38)));
Long yaw = Long.parseLong(yawHold.toString(), 16);
yawValue = Float.intBitsToFloat(yaw.intValue());
//increments the index1 to its next sequence of message 1
//-1 is returned if there is not another
index1 = sb.indexOf(mes1, (index1 + Stop1));
}
//this if statement deals with the second message
//There are five sets of data pulled from message 2 {velNValue, velEValue, latValue, logValue, altValue}
if(index2 < index1 && (index2 != -1) && (index2 != 0)){
altHold.setLength(0);
latHold.setLength(0);
logHold.setLength(0);
velNHold.setLength(0);
velEHold.setLength(0);
velNHold.append(sb.substring((navIndex + 26),(navIndex + 28)));
velNHold.append(sb.substring((navIndex + 24),(navIndex + 26)));
velNHold.append(sb.substring((navIndex + 22),(navIndex + 24)));
velNHold.append(sb.substring((navIndex + 20),(navIndex + 22)));
Long velN = Long.parseLong(velNHold.toString(), 16);
velNValue = Float.intBitsToFloat(velN.intValue());
velEHold.append(sb.substring((navIndex + 34),(navIndex + 36)));
velEHold.append(sb.substring((navIndex + 32),(navIndex + 34)));
velEHold.append(sb.substring((navIndex + 30),(navIndex + 32)));
velEHold.append(sb.substring((navIndex + 28),(navIndex + 30)));
Long velE = Long.parseLong(velEHold.toString(), 16);
velEValue = Float.intBitsToFloat(velE.intValue());
// latHold.append(sb.substring((navIndex + 82),(navIndex + 84)));
// latHold.append(sb.substring((navIndex + 80),(navIndex + 82)));
// latHold.append(sb.substring((navIndex + 78),(navIndex + 80)));
// latHold.append(sb.substring((navIndex + 76),(navIndex + 78)));
// latHold.append(sb.substring((navIndex + 74),(navIndex + 76)));
// latHold.append(sb.substring((navIndex + 72),(navIndex + 74)));
// latHold.append(sb.substring((navIndex + 70),(navIndex + 72)));
// latHold.append(sb.substring((navIndex + 68),(navIndex + 70)));
// Long lat = Long.parseLong(logHold.toString(), 16);
// Float latValue = Float.intBitsToFloat(lat.intValue());
//
// logHold.append(sb.substring((navIndex + 98),(navIndex + 100)));
// logHold.append(sb.substring((navIndex + 96),(navIndex + 98)));
// logHold.append(sb.substring((navIndex + 94),(navIndex + 96)));
// logHold.append(sb.substring((navIndex + 92),(navIndex + 94)));
// logHold.append(sb.substring((navIndex + 90),(navIndex + 92)));
// logHold.append(sb.substring((navIndex + 88),(navIndex + 90)));
// logHold.append(sb.substring((navIndex + 86),(navIndex + 88)));
// logHold.append(sb.substring((navIndex + 84),(navIndex + 86)));
// Long log = Long.parseLong(logHold.toString(), 16);
// Float logValue = Float.intBitsToFloat(log.intValue());
//
//
// altHold.append(sb.substring((navIndex + 114),(navIndex + 116)));
// altHold.append(sb.substring((navIndex + 112),(navIndex + 114)));
// altHold.append(sb.substring((navIndex + 110),(navIndex + 112)));
// altHold.append(sb.substring((navIndex + 108),(navIndex + 110)));
// altHold.append(sb.substring((navIndex + 106),(navIndex + 108)));
// altHold.append(sb.substring((navIndex + 104),(navIndex + 106)));
// altHold.append(sb.substring((navIndex + 102),(navIndex + 104)));
// altHold.append(sb.substring((navIndex + 100),(navIndex + 102)));
// Long alt = Long.parseLong(altHold.toString(), 16);
// Float altValue = Float.intBitsToFloat(alt.intValue());
//increments the index2 to its next sequence of message 2
//-1 is returned if there is not another
index2 = sb.indexOf(mes2, (index2 +Stop2));
}
}
}
}
}
我将感谢您的帮助,或者如果您能给我指出正确的方向,那就太好了。如果您需要我提供更多信息,我很乐意提供。
谢谢!
最佳答案
不建议(恕我直言)使用DataInputStream
读取不是由DataOutputStream
生成的数据。他们使用自己的协议(protocol)来写入/读取某些数据类型(例如 UTF 字符串)。
这不是上面代码的问题,因为它只是使用 readFully(1024)
读取字节。但使用此方法可能会出现问题:它会读取完整的缓冲区(最终会阻塞),除非连接关闭(正常或异常),也就是说,您的消息必须为 1024 字节长。
而且很难理解代码所做的转换。这就是我认为正在做的事情:字节到字符串(十六进制表示),十六进制值顺序更改的字符串,转换为长整型,转换为浮点型。我怀疑用字符串进行所有算术运算是最好的解决方案......
无论如何,我建议使用自己的方法,给定字节数组和(开始)索引,返回计算出的 float/double (避免重复,更容易理解和测试),例如:
private static float readFloat(byte[] buffer, int index) {
// not done in a loop for demonstration
int bits = (buffer[index+0] & 255)
+ ((buffer[index+1] & 255) << 8)
+ ((buffer[index+2] & 255) << 16)
+ ((buffer[index+3] & 255) << 24);
return Float.intBitsToFloat(bits);
}
更好的解决方案恕我直言,是使用ByteBuffer
来包装或代替byte[]
。 ByteBuffer
可以设置为小端字节序,并具有获取浮点型和 double 型 ( example ) 的方法,并且也可以作为从 Socket 读取数据的选项
关于java - 从InputStream中查找特定字节数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41930855/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!