Litle endian unsigned short в C ++ для Big endian, подписанный short в Java

Только что у меня произошло слишком сложное преобразование типов (я до сих пор не совсем понимаю их типы).
Я передал 0 — 1024 значения в виде 4 байтов (int) из Arduino в процессинг по последовательной связи. Вскоре я понял, что могу также послать короткий (2 байта), чтобы получить в 2 раза более быструю связь (и мне это нужно очень быстро).
Вот что я имею в C ++ на Arduino:

  // 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);
}

Теперь, в обработке, 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-значный дисплей, чтобы проверить значения приблизительно).

0

Решение

  • На стороне C ++ используйте htons() повернуть sшорты от hОстальная последовательность to netian endianness (htons: Короткая сеть хоста).
  • На стороне Java прочитайте форму сокета, запишите в ByteArrayOutputStream; когда у вас есть все данные, оберните это ByteArrayOutputStreamбазовый байтовый массив в ByteBuffer,
  • Прочитайте шорты, используя ByteBuffer«s .getShort(),
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]