最近在项目中需要用到modbus TCP通信协议,Qt自带的modbus只能一对一通信,不能做到1对多,所以选择开源库libmodbus
libmodbus协议介绍中文完整带书签版:https://download.csdn.net/download/u011251940/11341158
下载libmodbus源码包:https://www.libmodbus.org/releases/libmodbus-3.0.6.tar.gz
libmodbus使用手册:https://libmodbus.org/docs/v3.0.6/
libmodbus调试工具:https://download.csdn.net/download/u011251940/11341326
安装嵌入式arm版本
tar -zxvf libmodbus-3.0.6.tar.gz
cd libmodbus-3.0.6
./configure --build=i686 --host=arm-cortexa9-linux-gnueabihf --prefix=/opt/libmodbus/install
make -j8;make install
一、简单写一个libmodbus TCP通信demo测试
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <modbus.h>
#include "modbus/modbus.h"
#include "modbus/modbus-tcp.h"
#include "modbus/modbus-version.h"
//线圈地址数据的定义
const uint16_t UT_BITS_ADDRESS = 0x13;
const uint16_t UT_BITS_NB = 0x25;
const uint8_t UT_BITS_TAB[] = { 0xCD, 0x6B, 0xB2, 0x0E, 0x1B };
//离散量输入寄存器地址数据的定义
const uint16_t UT_INPUT_BITS_ADDRESS = 0xC4;
const uint16_t UT_INPUT_BITS_NB = 0x16;
const uint8_t UT_INPUT_BITS_TAB[] = { 0xAC, 0xDB, 0x35 };
//读保持寄存器地址数据的定义
const uint16_t UT_REGISTERS_ADDRESS = 0x6B;
/* Raise a manual exception when this adress is used for the first byte */
const uint16_t UT_REGISTERS_ADDRESS_SPECIAL = 0x6C;
const uint16_t UT_REGISTERS_NB = 0x3;
const uint16_t UT_REGISTERS_TAB[] = { 0x022B, 0x0001, 0x0064 };
/* If the following value is used, a bad response is sent.
It's better to test with a lower value than
UT_REGISTERS_NB_POINTS to try to raise a segfault. */
const uint16_t UT_REGISTERS_NB_SPECIAL = 0x2;
//输入寄存器地址数据定义
const uint16_t UT_INP