Part 2: let’s learn about the performance of sending single data point per UDP packet.
Basically, we’ll have “data points”, or “measurements” to send from the Arduinos to the Raspberry Pi. The idea is to try some simple methods to send those measurements or data points.
Experiment with single data point per UDP packet
Method 1: send a string
Arduino pseudo code: create and UDP packet that contains a string: data and a timestamp.
timestamp = micros();
Udp.beginPacket(ip, 4545);
Udp.write(data);
Udp.write(",");
Udp.write(timestamp);
Udp.write("\n");
Udp.endPacket();
Method 2: write two unsigned ints
Arduino code: do 2 writes to create the UDP packet.
timestamp = micros();
Udp.beginPacket(ip, 4545);
Udp.write((byte *) &data, sizeof(unsigned int));
Udp.write((byte *) ×tamp, sizeof(unsigned int));
Udp.endPacket();
Method 3: write the whole data point
Arduino code: store data in a struct, and write the whole struct in a single operation.
In this case, the struct is bigger than “Method 2”, since here I include 3 unsigned ints, so, I expect this method to be, maybe, slower than “Method 2”.
struct message {
unsigned int msg_type;
unsigned int value;
unsigned int timestamp;
};
And to send the data point:
data_point.msg_type = 0;
data_point.value = counter;
data_point.timestamp = micros();
Udp.beginPacket(ip, 4545);
Udp.write((byte *) &data_point, sizeof(message) * len);
Udp.endPacket();
Results
Method | Packets per second |
---|---|
Method 1: send a string | 509 |
Method 2: write two unsigned ints | 640 |
Method 3: write the whole data point | 726 |
Clearly “Method 3” is the best regarding performance.
Source code
Real code used to run these tests can be found at udp.cpp.