unsigned long tic_loop = 0; 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("Init."); 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() { size_t n = Serial.available(); if (!n) return false; int bytes_received = Serial.read(channels_buffer + bytes_read, std::min(n, UNIVERSE_SIZE - bytes_read)); bytes_read += bytes_received; // Serial.printf("rx n=%d rec=%d total=%d\n", n, bytes_received, bytes_read); if (bytes_read == UNIVERSE_SIZE) { bytes_read = 0; // Serial.println(); // Serial.println("Updated."); return true; } else { return false; } } void send_dmx_header() { Serial1.flush(); Serial1.begin(90000, SERIAL_8N2); /* while (Serial1.available()) Serial1.read(); */ // send the break as a "slow" byte Serial1.write(0); // switch back to the original baud rate Serial1.flush(); Serial1.begin(250000, SERIAL_8N2); /* while (Serial1.available()) Serial1.read(); */ Serial1.write(0); // Start-Byte }