Только что у меня произошло слишком сложное преобразование типов (я до сих пор не совсем понимаю их типы).
Я передал 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-значный дисплей, чтобы проверить значения приблизительно).
htons()
повернуть s
шорты от h
Остальная последовательность to
n
etian endianness (htons
: Короткая сеть хоста).ByteArrayOutputStream
; когда у вас есть все данные, оберните это ByteArrayOutputStream
базовый байтовый массив в ByteBuffer
,ByteBuffer
«s .getShort()
,Других решений пока нет …