1. 程式人生 > 實用技巧 >linux嵌入式軟體中libmudbus庫的移植與使用(二)

linux嵌入式軟體中libmudbus庫的移植與使用(二)

相關內容:

  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