libmodbus庫的交叉編譯:
1】到libmodbus官網https://libmodbus.org/download/下載安裝包,內部自帶configure文件,官網推薦v3.1.6穩定版。
另外注意,如果是從github上克隆源碼的,則包里沒有configure文件,需要額外安裝部分軟件,才能生成configure腳本。
github下載需要安裝額外軟件(官網下載跳過):
sudo apt install autoconf
sudo apt install automake
sudo apt install libtool
./autogen.sh
即可生成configure文件。
2】解壓安裝包:tar zxvf libmodbus-3.1.6.tar.gz
3】進入安裝包:cd libmodbus-3.1.6
4】創建文件夾,存放編譯輸出:mkdir install
5】source交叉編譯環境變量:source ~/Downloads/neoway-arm-oe-linux/neoway-env-init.sh,根據實際目錄調整
6】配置交叉編譯器:./configure --host=arm-oe-linux-gnueabi --enable-static --prefix=/home/a/gitlab-ws/libmodbus-3.1.6/install/,注意prefix目錄改為第4】步創建的目錄(pwd命令可查看路徑,復制即可)
7】make
8】make install
這樣就會在剛剛創建的install文件夾下,看到include,lib,以備主程序調用。
將lib下的3個動態庫libmodbus.so.x.x,項目所在環境的/usr/lib目錄。
使用:
在項目makefile文件中 -L./lib -lmodbus 在調用函數的c文件中引入.h文件
modbus的初始化對象操作和設置參數
ctx = modbus_new_rtu("/dev/ttyHSL0", 9600, 'N', 8, 1); //set slave modbus addr defalut is 3 modbus_set_slave(ctx, 3); //set modbus timeout 3s modbus_set_response_timeout(ctx, 3, 0); //sec,usec,超時設置 設置為3s //modbus_set_byte_timeout(ctx, 0, 800*1000);//800ms if (modbus_connect(ctx) == -1) { fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); modbus_free(ctx); return -1; }
modbus讀取輸入寄存器實例
uint16_t inv_data_buf[125] = {0}; //每幀最多125個寄存器,官方規定 memset(inv_data_buf, 0, sizeof(inv_data_buf)); int len =modbus_read_input_registers(ctx, 1000, 56, inv_data_buf); //1000 56 if (len < 0) { printf("[error] read 3x registers: (%d)\n", len); return -1; }