linux嵌入式軟體中libmudbus庫的移植與使用(二)
阿新 • • 發佈:2020-07-25
相關內容:
linux嵌入式軟體中libmudbus庫的移植與使用(一)
linux嵌入式軟體中libmudbus庫的移植與使用(二)
測試環境:
在上一篇文件中,建立的install資料夾下,看到include、lib,以備主程式呼叫。將install資料夾下include裡modbus中.h檔案、lib裡的直接複製到
含有下面測試程式碼modbus.c資料夾中。
測試程式碼modbus.c:
#include<errno.h> #include<string.h> #include <stdio.h> #include <unistd.h> #include<modbus.h> typedef struct { unsigned short null_0; // 0x00 unsigned short key1_state; // 0x01: 按鍵1狀態 unsigned short key2_state; // 0x02: 按鍵2狀態 unsigned short key3_state; // 0x03: 按鍵3狀態 unsigned short key4_state; // 0x04: 按鍵4狀態unsigned short wifi_comm_state; // 0x05: wifi通訊狀態 unsigned short batt_comm_state; // 0x06:電池通訊狀態 unsigned short null_1[9]; // 0x07~0xF unsigned short percentage; // 0x10: 電量 unsigned short voltage; // 0x11: 電壓 unsigned short in_current; //0x12: 充電電流 unsigned short out_current; // 0x13: 放電電流 unsigned short ch_state; // 0x14: 充電狀態 unsigned short ch_key; // 0x15: 充電按鍵 }display_t; display_t disp_date; static void display_fresh(void) { // disp_date.key1_state = 1; disp_date.key2_state =1; disp_date.key3_state = 1; disp_date.key4_state =1; } int main(void) { modbus_t *ctx = NULL; #if 0 ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1); //設定從機號碼 modbus_set_slave(ctx, 1); //modbus_set_response_timeout(ctx, 3, 0); //sec,usec,超時設定 設定為3s if(modbus_connect(ctx) == -1) { printf("Connection failed: %s\n",modbus_strerror(errno)); modbus_free(ctx); } memset(&disp_date, 0, sizeof(display_t)); while(1) { display_fresh(); printf("111:%d,%d,%d,%d,",disp_date.key1_state,disp_date.key2_state,disp_date.key3_state,disp_date.key4_state); modbus_write_registers(ctx, 0, sizeof(display_t)/sizeof(unsigned short), (const uint16_t*)&disp_date); modbus_read_input_registers(ctx, 0, sizeof(display_t)/sizeof(unsigned short), ( uint16_t*)&disp_date); printf("222:%d,%d,%d,%d,",disp_date.key1_state,disp_date.key2_state,disp_date.key3_state,disp_date.key4_state); usleep(50*1000); } #else
ctx = modbus_new_tcp("192.168.43.123", 8080); modbus_set_debug(ctx, TRUE); modbus_set_slave(ctx, 1);//設定從機號碼 if (modbus_connect(ctx) == -1) { printf("modbus connection failed: %s\n",modbus_strerror(errno)); modbus_free(ctx); } memset(&disp_date, 0, sizeof(display_t)); while(1) { display_fresh(); printf("1111:%d,%d,%d,%d\n",disp_date.key1_state,disp_date.key2_state,disp_date.key3_state,disp_date.key4_state); modbus_write_registers(ctx, 0, sizeof(display_t)/sizeof(unsigned short), (const uint16_t*)&disp_date); modbus_read_input_registers(ctx, 0, sizeof(display_t)/sizeof(unsigned short), ( uint16_t*)&disp_date); printf("2222:%d,%d,%d,%d\n",disp_date.key1_state,disp_date.key2_state,disp_date.key3_state,disp_date.key4_state); usleep(1000*1000); } #endif modbus_close(ctx); //關閉modbus連線 modbus_free(ctx); //釋放modbus資源,使用完libmodbus需要釋放掉 return 0; }
makefile:
CROSS = LIB_PWD = $(shell pwd) TARGET_BIN = test CPP = $(CROSS)g++ -std=c++11 CC = $(CROSS)gcc LD = $(CROSS)ld CFLAGS += -I$(shell pwd) CFLAGS += -Wall -g LDFLAGS += -lmodbus -ldl -lm -lrt -L$(LIB_PWD) STATIC_LIB += $(LIB_PWD)/libmodbus.a SRCS = $(wildcard *.c) OBJS = $(patsubst %.c,%.o,$(SRCS)) %.o: %.c $(CPP) $(CFLAGS) -o $@ -c $< all:$(OBJS) $(CPP) -o $(TARGET_BIN) $(OBJS) $(STATIC_LIB) $(LDFLAGS) clean: rm -f *.o