玩轉Libmodbus(一) 搭建開發環境


這篇文章是轉載的,我主要是參考了其搭建環境的部分。

轉載自:

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調試助手,設置好波特率等,設置要與上述程序中的保持一致。

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調試助手與開發板數據可以正常傳輸,測試成功,如圖。

ModBus調試助手發送數據界面
ARM開發板測試程序接收到的數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM