Thank to Jonathan L for this brilliant work on fixing some timing conditions with the sending side of the DMXSerial library.
From his comment:
I'm sure the existing timings (81us break) are pretty much fine with almost all DMX inputs, even though the spec says that the transmitted break time needs to be >= 92 us with MAB >= 12 us. Nonetheless I was motivated to fix it to be as close to 100 us/12us as I could, as this is what is transmitted by most of the commercial DMX units I've seen.
The real issue would be if you ran this on a faster processor, in which case the timings would break when the interrupt service routine became faster than the byte time. I was running this on 16 MHz Atmega 328. Most of the ISR is spent doing the long division inside DMXSerialBaud(): I replaced it with a compile-time calculation of the prescaler value, and this results in trashing the last data byte and the break. You can see the results in attached timing23.png.
Happily all is fixed by the changes, although the code is a bit more complex.
I studied the changes to the routines and I understand h did everything. It's all well commented and I like his programming style too. I loaded it into a project I have done some months ago and it works fine.
I personally haven't used much the sending part of the library. The last projects were lighting systems that are controlled by DMX used the receiving part only and I found it reliable but he fixed a buffer bug in this too.