【问题标题】:Litle endian unsigned short in C++ to Big endian signed short in JavaC++ 中的 Little endian unsigned short 到 Java 中的 Big endian signed short
【发布时间】:2013-06-18 00:18:36
【问题描述】:

刚才,我碰巧有过复杂的类型转换(我仍然不能完全理解它们的类型)。
我通过串行链接将 0 - 1024 个值作为 4 个字节(int)从 Arduino 传输到处理。很快我意识到我也可以发送短消息(2 个字节)来获得 2 倍的通信速度(我需要它非常快)。
所以这就是我在 arduino 上的 C++ 中所拥有的:

  // variable to store the value coming from the sensor
  unsigned short sensorValue = 0;  
  //Time when I last sent the buffer (serial link seems to need some rest)
  unsigned long last_time_sent = millis();
  //Buffer to save data I've collected
  byte buffer[256];
  //Position in buffer
  byte buffer_pos = 0;

  while(1) {
    //Get 0 - 1024
    sensorValue = analogRead(sensorPin);
    //(Try to) convert Short to two bytes. I don't even which is first and which is last
    for(byte i=0; i<2; i++) {
       //Some veird bit-shifting, all saved in buffer with an offset
       buffer[i+buffer_pos] = (byte)(sensorValue >> ((2-i) * 8));
    }
    //Iterate buffer position
    buffer_pos+=2;
    //Currently, I send the data allways
    if(true||millis()-last_time_sent>30||buffer_pos+2>=255)
      Serial.write(buffer, buffer_pos);
    //Temporary delay for serial link to rest
    delay(50);
  }

现在,在 Processing 中,java 代码如下所示:

void serialEvent(Serial uselessParameter) {
  while (myPort.available() >= 2) {
    //java doesn't allow unsigned variables
    short number = 0;
    for(byte i=0; i<2; i++) {
      byte received = (byte)myPort.read();
      println("Byte received: "+Integer.toString((int)received));
      number |= myPort.read() << (2-i)*8;
    }
    //Save data for further rendering
    graph.add(number);  //Array of integers, java doesn't let me make array of short
  }
  //Clean old data
  while(graph.size()>MAX_GRAPH_SIZE)
    graph.remove(0);

}

我认为我在 arduino 方面出了点问题,因为我在输出中看到了这一点:

收到的字节数:0
收到的字节:-1
结果 2 字节数:-256

Arduino 应该发送大约 681 的值。(我有一个 1 位显示器来检查这些值)。

【问题讨论】:

  • 为什么不直接在C++端使用htons()以网络字节顺序传输数据呢?顺便说一句,在 Java 中,所有数字基本类型都是大端序
  • 我知道 Java 使用大端。它甚至在问题标题中注明。不知道htons()。我将不得不检查两个环境是否都支持它。
  • htons 的存在时间几乎与 C 语言一样长;)

标签: java c++ casting arduino processing


【解决方案1】:
  • 在 C++ 端,使用 htons()shorts 从 host 字节序转换为 to network 字节序(htons:主机到网络短)。
  • 在 Java 端,从套接字读取,写入ByteArrayOutputStream;获得所有数据后,将这个 ByteArrayOutputStream 的底层字节数组包装到 ByteBuffer 中。
  • 使用ByteBuffer.getShort()阅读短片。

【讨论】:

  • 这样有效吗?我将每秒扫描数百个字节。而且 Java 本身似乎很慢。
  • 哦,不,Java并不慢,这是一个超级神话。
  • 您听说过 LLVM,对吧? Java 的 JIT 已经领先了 15 年或更长时间
  • 从那以后这个神话就在我眼前发生了(将我的世界的性能和图形质量与 Metro 2033 进行比较)。当我在 C++ 中渲染块时,即使是我蹩脚而简单的代码,延迟也更少(没有)。
  • 我不做图形,我做服务器的东西——在那里,Java 大放异彩
猜你喜欢
  • 1970-01-01
  • 2019-06-30
  • 2020-12-01
  • 2018-05-15
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
相关资源
最近更新 更多