Как ни странно, самым сложным элементом оказывается протокол общения между различными модулями системы.
Модулей разных дофига. В одном модуле могут быть разные функционально законченные элементы, с интерфейсами между ними.
Интерфейсов этих тоже дофига разных. Для подключения внешних устройств сторонних производителей еще дополнительные интерфейсы.
Только основных интерфейсов получается CAN, Ethernet, SPI, RS485, RS232, 9-bit RX/TX, 1-wire, SFI/DATA.
Логика, возможности, предназначение и удобство у интерфейсов разные.
Требования к функциональности тоже разные. В одном случает надо асинхронно принимать короткие посылки с сенсоров pH, ORP, T и так далее.
В другом надо принимать десятки килобайт обновления прошивки какого-то конкретного модуля, причем в реальном времени без остановки работы как всей системы в целом, так и модуля прошивка в котором в данный момент обновляется (это кстати вообще нетривиальная вещь - обновить прошивку не останавливая ни на секунду работу модуля).
Причем с точки зрения логики работы программе должно быть все равно - какой интерфейс используется. На верхнем уровне формат посылки должен быть одинаков.
Уже мозг сломал 
А самое что прикольное - при адаптации существующих у меня на фирме протоколов выясняются прикольные вещи.
Диалог:
Я - "bufTransmit{3} ADDRESS_vu - это что такое" ?
Программист - "Кажется всегда FF. Зачем нужно - не знаю.Какой-то атавизм. Возможно пригодится, если делать мультимастера."
Я - "bufTransmit{4} sip, bufTransmit{6} sgt - для чего они ?"
Программист - "А-а-а! Этот протокол придумал не ............. Его притащил ................. с прежней работы. ....................... потом раскаивался, что пошел на поводу. Эти sip и sgt что-то значили в аппаратуре. Сейчас это рудименты, которые я иногда для чего-то использую - чего байтикам в пакете пропадать."
Смотрю на это и думаю, что иногда прикольно просматривать программы, которые уже лет 20 работают без нареканий 
Причем, если это все почистить и причесать, то как минимум нарекания возникнут, а как максимум все перестанет работать.