這篇文章是轉載的,我主要是參考了其搭建環境的部分。
轉載自:
https://blog.csdn.net/qq_40452910/article/details/88560310
一、源碼下載
1、libmodbus官網
https://libmodbus.org/download/
2、下載
選擇長期穩定版本libmodbus-3.0.6.tar.gz
二、交叉編譯
1、解壓
拷貝到相應目錄,解壓,例如拷貝在/usr/local/modbus下,modbus目錄需要自己創建
tar -zxvf libmodbus-3.0.6.tar.gz
2、創建安裝目錄
mkdir install
3、進入解壓的目錄
cd libmodbus-3.0.6
4、配置編譯選項
(注:--prefix選項是安裝目錄,根據自己環境確定)
./configure --host=[交叉編譯工具鏈前綴] --enable-static --prefix=[安裝路徑]/install/
[安裝路徑]例如/usr/local/modbus,[交叉編譯工具鏈]例如arm-none-linux-gnueabi
5、編譯
make
6、安裝
make install
若出現了錯誤:
../libtool: line 1102: arm-none-linux-gnueabi-ranlib: command not found
make[2]: *** [install-libLTLIBRARIES] Error 127
make[2]: Leaving directory `/usr/local/modbus/libmodbus-3.0.6/src'
make[1]: *** [install-am] Error 2
make[1]: Leaving directory `/usr/local/modbus/libmodbus-3.0.6/src'
make: *** [install-recursive] Error 1
解決方法:
執行sudo –i,執行完之后會自動切換到/root目錄。所以需要切換回之前的目錄,執行make install,就可以成功。
7、生成動態鏈接庫
在install生成三個目錄:include lib share
lib文件夾中的libmodbus.so、libmodbus.so.5、libmodbus.so.5.0.5就是動態鏈接庫
三、移植到ARM開發板
1、復制文件到ARM開發板
將libmodbus.so、libmodbus.so.5、libmodbus.so.5.0.5復制到ARM開發板中的/usr/lib目錄下
執行cp libmodbus.so* /usr/lib(常用的動態鏈接庫,存放在該目錄下)會出現無法創建的問題(cannot create ‘/usr/lib/libmodbus.so*’: Read-only file system)。
解決方法:執行 wr cp libmodbus* /usr/lib
四、創建測試程序
1、創建測試程序C文件
在PC機linux系統下新建.c文件,將下列代碼粘貼進去
/*************************
**
** modbus-rtu-test.c
** 移植libmodbus庫到ARM開發板,並測試成功
**
**************************/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include "modbus.h" //modbus動態庫文件
int main(int argc, char *argv[])
{
uint16_t tab_reg[64] = {0}; //定義存放數據的數組
modbus_t *ctx = NULL;
int rc;
int i;
//以串口的方式創建libmobus實例,並設置參數
ctx = modbus_new_rtu("/dev/ttyS1", 115200, 'N', 8, 1);
if (ctx == NULL) //使用UART1,對應的設備描述符為ttyS1
{
fprintf(stderr, "Unable to allocate libmodbus contex\n");
return -1;
}
modbus_set_debug(ctx, 1); //設置1可看到調試信息
modbus_set_slave(ctx, 1); //設置slave ID
if (modbus_connect(ctx) == -1) //等待連接設備
{
fprintf(stderr, "Connection failed:%s\n", modbus_strerror(errno));
return -1;
}
while (1)
{
printf("\n----------------\n");
rc = modbus_read_registers(ctx, 0, 10, tab_reg);
if (rc == -1) //讀取保持寄存器的值,可讀取多個連續輸入保持寄存器
{
fprintf(stderr,"%s\n", modbus_strerror(errno));
return -1;
}
for (i=0; i<10; i++)
{
printf("reg[%d] = %d(0x%x)\n", i, tab_reg[i], tab_reg[i]);
}
usleep(3000000);
}
modbus_close(ctx); //關閉modbus連接
modbus_free(ctx); //釋放modbus資源,使用完libmodbus需要釋放掉
return 0;
}
2、復制庫中頭文件
將/usr/local/modbus/install/include/modbus中的四個頭文件modbus.h、modbus-rtu.h、modbus-tcp.h、modbus-version.h復制到上邊C語言文件同一文件夾。
3、交叉編譯
arm-none-linux-gnueabi-gcc test.c -o test -L /usr/local/modbus/install/lib/ -lmodbus
4、復制可執行文件到開發板
將可執行程序文件test復制到ARM開發板的文件夾下。
五、安裝ModbusPoll及ModbusSlave
六、測試
1、測試准備
在執行上述步驟前,需要先連接好相應的硬件,比如串口線等,然后打開ModBus調試助手,設置好波特率等,設置要與上述程序中的保持一致。

2、在ARM上運行test程序
若出現錯誤:./test: error while loading shared libraries: libmodbus.so.5: cannot open shared object file: Error 20
解決方法:將libmodbus.so、libmodbus.so.5、libmodbus.so.5.0.5三個動態鏈接庫復制到當前文件下,就可以正常執行。
3、移植成功
發現ModBus調試助手與開發板數據可以正常傳輸,測試成功,如圖。

