写在文章最开头简单介绍一下,我这篇文字是基于什么背景而写下的,以便各位能更快速地判断本文是否符合您的需要。

文章背景:目前我自己本人是一名大四学生,由于近期在做毕业设计,需要在linux系统下读取一款压力传感器的数值,这款传感器采用了RS485转USB连接到电脑,想要读取传感器数据,就需要通过电脑向传感器发送读取指令(例如:FE 04 00 00 00 01 25 C5),传感器会返回相同格式的一串指令(地址码+功能码+数据区+校验码),由于我做的项目是一个大型项目的一个小分支,我需要读取这个数据,并且可以使用。如果仅仅是为了看到显示的数值,可以尝试使用带CRC校验的串口助手。

接下来我将进入正体和大家分享一下自己如何在ubuntu20.04上下载并应用libmodbus库读取传感器数据。

1.下载libmodbus库

安装建议参考这篇文章:

Linux编译安装libmodbus库_一只嵌入式爱好者的博客-CSDN博客_安装libmodbus

按照这个文章安装下来,至于后面的使用部分,文章写的多少有点玄学,并且有点跨度较大,难以理解,只要执行到sudo make install就可以了。至于安装上之后是否真的有用,我觉得应该作为一个环境放在系统里,虽然我没有引用下载下来的头文件,因为引用的时候,总是会在响应时间那里报错。个人建议自己重新按照CMake,将所有文件重新编译一次生成一个新的so库和头文件,特别是从站地址大于247的情况,可以通过修改modbus_rtu.c文件下的一个参数,将247修改为255就可以实现从站地址的扩充,因为libmodbus库默认的范围到247。

2.学习CMake

http://file.ncnynl.com/ros/CMake%20Practice.pdf

下载下来这篇文章,跟着里面的步骤从t1做到t4,并且自己适当扩展一下,因为后面我们所有需要用的东西都得依靠CMake。

这里是一个错误,需要将括号里的内容修改为hello ${SRC_LIST}

4.按照CMake编译一个新的libmodbus库(因为我自己的传感器从站地址是254,需要修改)

链接: https://pan.baidu.com/s/1n-sFp6sAPbZa4c-7lm6-BQ 提取码: l900

这是我自己开发所需要的文档之类的其中:

(1)有重要的头文件放在h文件夹里,下载好的libmodbus库只有四个头文件没有config.h,这个头文件是我从windows系统上安装libmodbus做测试的时候,在VS上编译生成dll库的时候,在x64文件家里找到的,抱着试试看的心理复制到了ubuntu上,发现可以使用。

(2)C和C++两个文件夹放了我自己写的两种语言版本的程序,我自己测试后都是可以直接运行的。

(3)modbus文件夹放置了修改libmodbus库所需要的c文件和h文件,编译该文件夹之后会在你学习CMake时生成libhello.so的地方生成libmodbus.so这一步一定要做,通过指令下载的libmodbus库会遇到这一段程序报错。

struct timeval t;t.tv_sec=0;t.tv_usec=1000000;        //set modbus time 1000msmodbus_set_response_timeout(ctx,&t);

提取出文档之后,打开modbus文档,在里面添加一个build文件夹,按照CMake的步骤执行就可以生成所需要的头文件和库文件了。生成之后,可以在/usr/include里面找到modbus文件夹,把我分享的h文件夹里的文件复制到modbus文件夹里,替换掉之前的那些文件。如果提示你不可以粘贴,就用sudo cp -i modbus.h /usr/include/modbus 这条指令挨个复制进去。

如果需要从站地址的参数,可以找到lib文件夹里的modbus-rtu.c进行修改。

static int _modbus_set_slave(modbus_t *ctx, int slave)
{/* Broadcast address is 0 (MODBUS_BROADCAST_ADDRESS) */if (slave >= 0 && slave <= 255) {ctx->slave = slave;} else {errno = EINVAL;return -1;}return 0;
}

直接修改这个数值就可以,我给的文件是我已经修改过的文件,原来安装的是247。

4.运行代码

在我分享的百度网盘链接里,我会给出C++和C两个版本,但都需要用CMake来运行,直接用编译器会出现头文件报错,因为我们的都文件声明链接都在CmakeList.txt中。编译器打开项目,需要一整个文件全放进去,我不太喜欢VS Code,所以我都直接用CMake来运行。

C文件夹里面应该有三个东西,一个是编译位置build文件夹,一个是程序所在地lib文件夹和一个声明CMakeList.txt。最重要的文件放在lib里面

main.c

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
#include "modbus.h"char* getDateTime();int main(int argc, char const *argv[])
{modbus_t *ctx;uint16_t tab_reg[64];int rc=0;int i=0;ctx = modbus_new_rtu("/dev/ttyUSB0", 9600,'N',8,2);//配置端口,“”内写的是端口,Win系统下是COM*,Ubuntu是/dev/ttyusb*
modbus_set_slave(ctx,254);//设置从站地址,就是指令的前两位十六进制换算成十进制 例:FE(H)=254(D)
if (modbus_connect(ctx) == -1) {fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));modbus_free(ctx);return -1;
}struct timeval t;t.tv_sec=0;t.tv_usec=1000000;        //set modbus time 1000msmodbus_set_response_timeout(ctx,&t);//设置响应时间while (1) {char* nowtime = getDateTime();rc = modbus_read_input_registers(ctx,0,1, tab_reg);if (rc == -1) {fprintf(stderr, "%s error-test\n", modbus_strerror(errno));return -1;
}printf("%s:压力值:%d g \n十六进制显示:(0x%X)\n",nowtime, tab_reg[0], tab_reg[0]);usleep(10);
}modbus_close(ctx);
modbus_free(ctx);return 0;
}char* getDateTime()//获取当前时间
{static char nowtime[20];time_t rawtime;struct tm* ltime;time(&rawtime);ltime = localtime(&rawtime);strftime(nowtime, 20, "%Y-%m-%d %H:%M:%S", ltime);return nowtime;
}

CMakeList.txt

ADD_EXECUTABLE(main main.c)//编译main.c后生成可执行文件main
INCLUDE_DIRECTORIES(/usr/include/modbus)//头文件所在位置
TARGET_LINK_LIBRARIES(main libmodbus.so)//连接库

5.运行结果

C语言版本运行结果(这个需要端口真实的接传感器,Windows可以用modbus slave模拟)

C++版本

博主QQ:3122899873 有具体遇到的问题可以加QQ来问,也可以留言,看到都会尽量回复!

Ubuntu下libmodbus的应用相关推荐

  1. ubuntu下libmodbus库的使用

    工作项目中,机器人要完成一个电源管理的功能,自带可充电触点接触充电的电池,具体参数不表,代码要完成通过无线网络与西门子的PLC通信,从而控制充电房的开门与关门,以及控制充电处的继电器的开启与关闭,协议 ...

  2. 在Ubuntu下构建Bullet以及执行Bullet的样例程序

    在Ubuntu下构建Bullet以及执行Bullet的样例程序 1.找到Bullet的下载页,地址是:https://code.google.com/p/bullet/downloads/list 2 ...

  3. 在ubuntu下设置eclipse开发STM32等嵌入式设备

    之前为了能够让ROS与底层能够顺利通讯,我采用可开源开发板arduino ,因为arduino有ROS的库,能够按照ROS wiki上所给的教程就可以顺利的开发,但由于arduino的局限性,我觉得是 ...

  4. Ubuntu 下安装thttpd Web服务器

    不知道大家是不是真的需要用appache这么复杂的功能这么强大的web server,其实有很多时候使用webserver也只是一种远程共享访问的方式.这里,Ubuntu repository的提供了 ...

  5. Ubuntu下安装Apache+PHP+Mysql

    Ubuntu下安装 apache+php+mysql文本服务器! ------------------------------------------------------------------- ...

  6. Ubuntu下使用CMake编译OpenSSL源码操作步骤(C语言)

    OpenSSL的版本为1.0.1g,在ubuntu下通过CMake仅编译c代码不包括汇编代码,脚本内容如下: build.sh内容: #! /bin/bashreal_path=$(realpath ...

  7. ubuntu下nginx+php5的部署

    ubuntu下nginx+php5环境的部署和centos系统下的部署稍有不同,废话不多说,以下为操作记录: 1)nginx安装 root@ubuntutest01-KVM:~# sudo apt-g ...

  8. 在Ubuntu下FFmpeg编译,支持x264和x265(HECV)

    所有下载的源 在Ubuntu下FFmpeg编译,支持x264和x265. Ubuntu 12.04 FFmpeg 2.1 Release 注意: cmake要升级要2.8.8 yasm要升级到1.2. ...

  9. Ubuntu下添加新分区并设置挂载点

    Ubuntu下添加新分区并设置挂载点 最近在做Android项目,可是解压根文件系统以后,就报警说硬盘不够.当初设置使用的大小为15G.不过扩展分区还是很方便的.当然首先你得设置添加使用的硬盘大小,这 ...

  10. ubuntu下安装ftp服务器

    ubuntu下安装ftp服务器 Ftp服务器是使用以vsftp为例. 1. 安装     $sudo aptitude install vsftpd     $ps aux | grep 'ftp' ...

最新文章

  1. 分类问题中的“维数灾难” - robotMax
  2. 浙江巨丰管业有限公司网站
  3. RPC创建API 模块
  4. ionic 修改开发工具的配置
  5. 强制消除Xcode警告的方法
  6. 接口上加@feignclient还有实现类_类接口的实现及应用
  7. 置顶信息[置顶] 常用日常英语缩写
  8. JPA、Hibernate、Springdata JPA
  9. python第三方插件pip是什么_Python怎么安装第三方模块?
  10. Zabbix 5.0 监控 SSH 登录
  11. Altium Designer 09简易教程(一)
  12. 鸿蒙电视rom,鸿蒙系统刷机包
  13. 优盘弹出文件或目录损坏且无法读取实测解决教程
  14. 把一个代表DateTime带有T和Z的string转化成DateTime c#
  15. Python绘制多维度专题地图
  16. 如何免费制作表白二维码?
  17. idea启动报错‘否则 JavaFX 应用程序类必须扩展javafx.application.Application’
  18. 个人项目-网络电话呼叫客户端 (一)
  19. oracle 提取中文字符串拼音首字母函数,拼音简码提取函数
  20. 全部重点排污企业名录(整理成Excel更新至2021年)

热门文章

  1. 【Linux 操作系统】vim编辑器配置及常用命令
  2. Cesium 获取屏幕所在经纬度范围
  3. mhdd硬盘测试软件,mhdd硬盘检测工具使用攻略 mhdd硬盘检测工具如何使用
  4. 【C++设计模式】建造者模式
  5. selenium 截长图
  6. 微信网页支付之H5支付
  7. 项目总结 【电商后台管理系统】
  8. RS485总线传输协议
  9. 二元函数的洛必达法则
  10. css判断手机端还是pc端,JavaScript判断设备是手机端还是PC端,并加载不同的css/js文件...