安装可以看这个博客:
https://blog.csdn.net/hanhui22/article/details/105786762
它的安装可以,但是编译测试看不太懂,我没跟着它的编译,完了后把/lib下的
放到开发板的/usr/lib下
编写代码:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <modbus.h>#define MODBUS_DEV_NAME "/dev/ttyUSB3" ///< 串口设备int main(void)
{modbus_t *ctx =NULL;// 以串口的方式创建libmobus实例,并设置参数ctx = modbus_new_rtu(MODBUS_DEV_NAME, 115200, 'N', 8, 1);if (ctx == NULL) //使用UART4,对应的设备描述符为ttymxc3{fprintf(stderr, "Unable to allocate libmodbus contex\n");return -1;}// 使用RS485时需考虑设置串口模式、RTS引脚等
// modbus_rtu_set_serial_mode(MODBUS_RTU_RS485); //设置串口模式modbus_set_debug(ctx, 1); //设置1可看到调试信息modbus_set_slave(ctx, 1); //设置slave IDif (modbus_connect(ctx) == -1) //等待连接设备{fprintf(stderr, "Connection failed:%s\n", modbus_strerror(errno));return -1;}int i,rc;uint16_t tab_reg[64] = {0}; //定义存放数据的数组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(5000000);}modbus_close(ctx); //关闭modbus连接modbus_free(ctx); //释放modbus资源,使用完libmodbus需要释放掉return 0;
}
然后编译,一个是头文件路径,一个是动态库路径,我在编译完后,移植到arm开发板上遇到一个问题/dev/ttyUSB3找不到了,就是串口直接都不见了,最后拔电重启一下就好了,接着配置modbus-slave
执行成功如下,读取出了保持寄存器的值