This is a follow-up to yesterday's codereview-question about reading serial data and parsing it reading serial data and parsing it.
This is a follow-up to yesterday's codereview-question about reading serial data and parsing it.
This is a follow-up to yesterday's codereview-question about reading serial data and parsing it.
Serial-data read buffer handling
This is a follow-up to yesterday's codereview-question about reading serial data and parsing it.
The code below is run into a seperate thread looped endlessly.
Currently I track the position in my inputBufer
manually and copy all bytes which haven't been processed into a new byte-array and assigning that to the old inputBuffer
.
Can the read buffer handling be improved?
bytesRead = SerialPort.Read(inputBuffer, bufferPos, SerialPort.BytesToRead);
bufferPos += bytesRead;
bytesProcessed = 0;
// process data-packets
for (int i = 0; i < this.bufferPos; i++) {
// Flex sensor data
//
if (this.bufferPos-i >= 14 && inputBuffer[i] == 'F'){
i++;
short[] sensorData = new short[6];
sensorData[0] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // thumb
sensorData[1] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // index finger (finger knuckle)
sensorData[2] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // middle finger
sensorData[3] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // ring finger
sensorData[4] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // not used
sensorData[5] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // index finger (hand knucke)
// checksum
byte checksum = inputBuffer[i++];
ParseSerialData(PacketType.Flex, sensorData, checksum);
bytesProcessed = i;
//Debug.Log (sensorData[0] + " then " + bytesProcessed);
}
// Raw sensor data
//
if (this.bufferPos-i >= 20 && inputBuffer[i] == 'S'){
i++;
short[] sensorData = new short[9];
sensorData[0] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // gyroscope X
sensorData[1] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // gyroscope Y
sensorData[2] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // gyroscope Z
sensorData[3] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // accelerometer X
sensorData[4] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // accelerometer Y
sensorData[5] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // accelerometer Z
sensorData[6] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // magnetometer X
sensorData[7] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // magnetometer Y
sensorData[8] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // magnetometer Z
// checksum
byte checksum = inputBuffer[i++];
ParseSerialData(PacketType.Raw, sensorData, checksum);
bytesProcessed = i;
}
// Quaternion of device's rotation
//
if (this.bufferPos-i >= 20 && inputBuffer[i] == 'Q'){
i++;
short[] sensorData = new short[4];
sensorData[0] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // W
sensorData[1] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // X
sensorData[2] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // Y
sensorData[3] = (short)((short)inputBuffer[i++] << 8 | inputBuffer[i++]); // Z
// checksum
byte checksum = inputBuffer[i++];
ParseSerialData(PacketType.Quaternion, sensorData, checksum);
bytesProcessed = i;
}
}
// Copy unprocessed rest of stream
int rest = bufferPos - bytesProcessed;
if (rest > 0){
byte[] tempBuffer = new byte[4096];
Array.Copy (inputBuffer, bytesProcessed, tempBuffer, 0, rest);
inputBuffer = tempBuffer;
bufferPos = rest;
}
else {
inputBuffer = new byte[4096];
bufferPos = 0;
}