unsigned long tic_loop = 0; const unsigned int FRAME_TIME = 25; // 20 ms -> 50 FPS byte channels_buffer[512] = {0}; unsigned int bytes_to_write = 512; const unsigned int START_ADDR = 10; const unsigned int NUM_CHANNELS = 9; byte dmx_data[] = { 0, 0, 134, 255, 0, 0, 0, 0, 0, }; void setup() { Serial.begin(115200); // USB Serial1.begin(250000, SERIAL_8N2); // DMX tic_loop = millis(); for (int i = 0; i < NUM_CHANNELS; ++i) { channels_buffer[START_ADDR - 1 + i] = dmx_data[i]; } } void loop() { // update_buffer(); // this section gets executed at a maximum rate of around 40Hz if ((millis() - tic_loop) > FRAME_TIME) { tic_loop = millis(); send_dmx_header(); Serial1.write(channels_buffer, bytes_to_write); } delay(1); } void update_buffer() { int n = Serial.available(); if (n < 1) return; n -= 1; if (Serial.read() == n) { Serial.read(channels_buffer, n); bytes_to_write = n; } else { // incomplete while (Serial.available()) Serial.read(); } } 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 }