I changed the test sketch a little, to show you a different way of producing the same output.
The sketch times the for loop, and changes the way to operate when a 'x' is received.
#include <Wire.h>
#include <NewPing.h>
#define SONAR_NUM 3 // Number of Sonar
uint8_t i;
char inbyte; // command byte received from Rpi (Serial 1)
String sid; // String of Ultrasonic sensor id
String dist; // String of distance value
String outpackage; // String sent to rpi via Serial 1
String irsensor; // String of ir sensor id
String irstate; // ir sensor state
unsigned int distance;
void setup() {
Serial.begin(115200);
}
bool noString = true;
void loop() {
if (Serial.available() > 0) {
inbyte = Serial.read();
if (inbyte == 'C') {
uint32_t start = micros();
for (i = 0; i < SONAR_NUM; i++) {
distance = random(0, 400);
if (noString) {
Serial.write('u');
Serial.print(i + 1);
Serial.write(' ');
Serial.println(distance);
} else {
sid = String(i + 1);
dist = String(distance);
outpackage = "u" + sid + " " + dist + "\n";
Serial.print(outpackage);
}
}
uint32_t dur = micros() - start;
Serial.print("E ");
Serial.print(dur);
Serial.println(" us");
} else if (inbyte == 'x') {
noString = !noString;
} else if (inbyte != ' ') {
Serial.write(inbyte);
}
}
}
I changed the processing sketch to send 'Cx' so each 'scan' switches the method.
import processing.serial.*;
Serial port;
String inString = "nothing";
void setup() {
size(400, 400);
noStroke();
background(200);
printArray(Serial.list());
port = new Serial(this, "COM28", 115200);
port.bufferUntil('\n');
delay(2000);
}
int lastSend;
byte msg[] = { 'C', 'x' };
void draw() {
if (millis()-lastSend >= 100) {
lastSend = millis();
port.write(msg);
}
}
void serialEvent(Serial p) {
inString = trim(p.readString());
println(inString);
}
And part its output
u1 244
u2 158
u3 96
E 1004 us
u1 371
u2 264
u3 360
E 1476 us
u1 198
u2 351
u3 340
E 1060 us
u1 103
u2 351
u3 1
E 1436 us
u1 5
u2 280
u3 18
E 916 us
u1 74
u2 49
u3 13
E 1376 us
u1 120
u2 225
u3 12
E 1004 us
Using Strings cost you about 400 us per scan, which makes it 40% slower.
I think the non String code is a lot cleaner and does not need any additional variables.