Als Erstes: für solche Sachen nie die String-Klasse benutzen. Die zerstückelt Dir den Speicher auf unbrauchbare Grössen, schneller als Du denken kannst. Da in der aktuellen IDE zudem noch ein Speicherleck im Code ist, wird Dein Code damit keine 2 Sekunden durchstehen. Zudem: Code willst Du fast 25'000 Mal pro Sekunden ausführen und auch noch etwas LED-Hardware ansteuern? Ich wünsche Dir viel Erfolg, aber das wird schiefgehen.
Ich würde die Synchronisation extern (also z.B. ein separater Pin oder etwas ähnliches) machen und die Werte dann direkt schreiben bzw. lesen:
uint8_t pixelColor[NUM_ROWS][NUM_COLUMNS][3];
for (uint8_t y = 0; < NUM_ROWS; y++) {
for (uint8_t x = 0; x < NUM_COLUMNS; x++) {
Serial.write(pixelColor[y][x], 3);
}
}
Lesen:
uint8_t pixelColor[NUM_ROWS][NUM_COLUMNS][3];
uint8_t x = 0, y = 0, c = 0;
while (y < NUM_ROWS) {
while (! Serial.available());
pixelColor[y][x][c++] = Serial.read();
if (c >= 3) {
c = 0;
x++;
}
if (x >= NUM_COLUMNS) {
x = 0;
y++;
}
}
Mit solchem Code könntest Du schnell genug sein.
Wenn die externe Synchronisation nicht möglich ist, würde ich z.B. den hellsten Farbton als Marke definieren und bei den Farben 255,255,255 zu 254,254,254 umdefinieren. Dann kannst Du am Anfang immer 255,255,255 schicken und weisst, dass jetzt ein neues Frame anfängt.