Я колупался с freemodbus.
Действительно, очень удобная штука, вешается на что угодно (я вешал на msp430) и написана очень грамотно (для себя много почерпнул).
Цитата
Дело, похоже, в том что вызов ф-ии отправки в исходном коде происходит только после приема фрэйма
Насколько я понял, по приёму байта он просто пишется в буфер. По таймауту приёма (переполнение таймера) вызывается функция первичного анализа фрейма, по результату выставляются флаги.
Потом вы вызываете функцию poll() , которая обрабатывает пакет, вызывает соответствующие функции (read/write register/coil etc.), формирует ответный пакет и запускает передачу.
Мастер я не делал, но там всё должно быть несколько по другому. Отправляете пакет, запоминаете какой и кому. по приёму пакета опять та же первичная обработка (CRC и структура пакета), вызов poll(), которую надо переделать. она должна анализировать ответ на предмет соответствия запросу (адрес, команда), и если всё нормально, производить необходимые действия.
В целом, ИМХО, нужно переделать только poll() и добавить функцию отправки мастер-пакета. Ну и ещё учесть тайм-аут приёма пакета.