По основной теме вопроса: сам мучаюсь, но мучаюсь только по тому что "не умею" программировать. То что нужно продумывать архитектуру с самого нала - это в некоторых случаях крайне рекомендательно. У нас разрабатывается несколько устройств - приходится писать общие библиотеки. Приходится писать достаточно гибкие библиотеки - иначе переписывать приходится!
Как показала практика очень часто встречаются указатели на функции, стейт машины, операционки (freertos, chibios и т.д.) и т.д. Отличным подходом (имхо) буде написание низкоуровневых (HAL от stm32) и высокоуровневых функций (modbus, canopen и т.д.). Вот эти вещи посмотрите как делают.
По вопросу реализации коммуникации по рс485: если протокол отличный от модбаса, но похож - посмотрите на библиотеку freemodbus.
Сейчас тихонько пытаемся внедрить тесты. Есть отличная книжка на английском (переводов не встречал):
we.easyelectronics.ru/Nemo/tdd-dlya-embedded.html - там же ссылка на эту книгу.
Чем хорошо писать "под тесты"? Тем что писать каждую функцию приходится думая, а бы как не напишешь. Короче видим плюсы в этом!
Удачи!