Сборка под Debian:
git clone https://github.com/wirenboard/modbus-utils.git
cd modbus-utils
# Download libmodbus repo
git submodule update
# Build libmodbus
cd libmodbus
sudo apt update
sudo apt install autoconf automake libtool build-essential
./autogen.sh
./configure
make
# Check
ls -l src/.libs/
cd ..
# Build modbus_client & modbus_server
gcc ./modbus_client/modbus_client.c -I./common \
-I./libmodbus/src/ -L./libmodbus/src/.libs/ -lmodbus \
-o ./modbus_client/modbus_client
gcc ./modbus_server/modbus_server.c -I./common \
-I./libmodbus/src/ -L./libmodbus/src/.libs/ -lmodbus \
-o ./modbus_server/modbus_server
Внимательно следите за ошибками при запуске ./autogen.sh
перед сборкой libmodbus - там внутри вообще нет проверок, оно в любом случае напечатает Initialized build system. You can now run ./configure
.
Например тут, очевидно, забыли поставить пакет libtool
:
configure.ac:33: installing 'build-aux/compile'
configure.ac:56: installing 'build-aux/config.guess'
configure.ac:56: installing 'build-aux/config.sub'
configure.ac:32: installing 'build-aux/install-sh'
configure.ac:32: installing 'build-aux/missing'
src/Makefile.am:3: error: Libtool library used but 'LIBTOOL' is undefined
src/Makefile.am:3: The usual way to define 'LIBTOOL' is to add 'LT_INIT'
src/Makefile.am:3: to 'configure.ac' and run 'aclocal' and 'autoconf' again.
src/Makefile.am:3: If 'LT_INIT' is in 'configure.ac', make sure
src/Makefile.am:3: its definition is in aclocal's search path.
src/Makefile.am: installing 'build-aux/depcomp'
autoreconf: automake failed with exit status: 1
Для удобного использования можно добавить в конец ~/.bash_profile
или ~/.bashrc
:
MODBUS_UTILS="Полный путь до загруженного репозитория"
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}:}${MODBUS_UTILS}/libmodbus/src/.libs/"
PATH="${PATH:+${PATH}:}${MODBUS_UTILS}/modbus_client:${MODBUS_UTILS}/modbus_server"
BUS=/dev/ttyACM0 # Пример для Raspberry Pi B+
alias modbus_client="modbus_client -mrtu -b9600 -pnone -s2 $BUS"
Заметка: не забудьте дать вашему пользователю/группе прав на чтение/запись в устройство
$BUS
. Как вариант для Raspberry Pi - можно просто закинуть себя в группуdialout
:usermod -aG dialout $(whoami)
. Для совсем хлебушков, посмотреть права на устройство: ls -l $BUS.
Пример использования alias:
mak@metroid:~ # modbus_client --debug -a151 -t0x03 -r128
Opening /dev/ttyACM0 at 9600 bauds (N, 8, 2)
[97][03][00][80][00][01][98][D4]
Waiting for a confirmation...
<97><03><02><00><97><B1><F7>
SUCCESS: read 1 of elements:
Data: 0x0097