之前测试了qt交叉编译在imx6ull上运行,记录一下加上modbus库使用485读取ADAN8020-C变送模块数据。
一、交叉编译modbus库
到libmodbus官网https://libmodbus.org/download/下载安装包,内部自带configure文件,官网推荐v3.1.6稳定版。
github下载需要安装额外软件(官网下载跳过),然后解压将进入目录执行脚本autogen.sh,生成configure文件:
sudo apt install autoconf
sudo apt install automake
sudo apt install libtool
./autogen.sh
然后配置交叉编译modbus库
./configure --host=arm-linux-gnueabihf --prefix=/home/book/software/ArmModbus/libmodbus-master/install
make
make install
--host=arm-linux-gnueabihf-gcc --host指定环境,我们要在imx6ull板子上运行,需要32位的交叉编译器
--prefix 指定安装路径,我的路径在/home/book/software/ArmModbus/libmodbus-master/install
配置编译安装完成会在目录下生成库,在后续qt里指定头文件和库。
二、板子配置
板子包含了485驱动,设备树配置(由于设备树有点问题,小白搞了一天没成功,后续查找资料修改设备树才实验成功(悲))
485使用uart3,设备树配置如下
设备名称为ttymxc2
三、Qt代码测试
在ADAN8020-C模块简单接了320欧电阻,简单做个朴素(丑)的界面测试下,功能是读取ADAN8020-C通道1的电阻,手动计算温度值。开始和停止读取按钮,每500毫秒读取一次。
Qt工程modbus库文件,指定头文件和库文件,找到自己的路径
INCLUDEPATH += /home/book/software/ArmModbus/libmodbus-master/install/include/modbus
LIBS += -L/home/book/software/ArmModbus/libmodbus-master/install/lib -lmodbus
modbus库调用部分,就正常调用读取,比较简单,读取不同的地址就可以读取不同的数据了
// 打开串口并设置参数
ctx = modbus_new_rtu("/dev/ttymxc2", 9600, 'N', 8, 1);
if (ctx == NULL) {
fprintf(stderr, "Unable to create the context\n");
return -1;
}
// 打开调试模式
if(modbus_set_debug(ctx,true) == -1){
qDebug() << "debug set fail!";
return -1;
}
// 设置从机地址
if(modbus_set_slave(ctx,1) == -1){
qDebug() << "set slave fail!";
return -1;
}
// 连接设备
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
return -1;
}
// 读取保持寄存器
rc = modbus_read_registers(ctx, 1660, 2, tab_reg);
if (rc == -1) {
fprintf(stderr, "Modbus read failed: %s\n", modbus_strerror(errno));
}
完成后构建工程,拷贝可执行文件到nfs目录下,板子挂载执行
直接运行会报错,需要把交叉编译的modbus库文件拷贝到板子的环境中,复制到/lib目录下。
然后执行程序
参考文章: