unsigned long tic_loop = 0; unsigned long time_since_last_sync; const unsigned long SYNC_TIMEOUT = 1000; const unsigned int FRAME_TIME = 20; // 20 ms -> 50 FPS const size_t UNIVERSE_SIZE = 512; byte channels_buffer[UNIVERSE_SIZE] = {0}; size_t bytes_read = 0; void setup() { Serial.begin(115200); // USB while (!Serial) { // spin until serial is up } Serial.println(); Serial.println("Sync."); time_since_last_sync = millis(); Serial1.begin(250000, SERIAL_8N2); // DMX } void loop() { bool packet_ready = update_buffer(); if (packet_ready) { send_packet(); } } void send_packet() { send_dmx_header(); Serial1.write(channels_buffer, UNIVERSE_SIZE); } bool update_buffer() { unsigned long now = millis(); size_t n = Serial.available(); if (!n) { // nothing available to read if (now - time_since_last_sync > SYNC_TIMEOUT) { // re-sync bytes_read = 0; Serial.println("Sync."); time_since_last_sync = now; } return false; } time_since_last_sync = now; int bytes_received = Serial.read(channels_buffer + bytes_read, std::min(n, UNIVERSE_SIZE - bytes_read)); bytes_read += bytes_received; if (bytes_read == UNIVERSE_SIZE) { bytes_read = 0; Serial.println("Ack."); return true; } else { return false; } } void send_dmx_header() { Serial1.flush(); Serial1.begin(90000, SERIAL_8N2); // send the break as a "slow" byte Serial1.write(0); // switch back to the original baud rate Serial1.flush(); Serial1.begin(250000, SERIAL_8N2); Serial1.write(0); // Start-Byte }