嵌入式开源库之libmodbus学习笔记

socat

  1. 安装sudo apt-get install socat
  2. 创建终端 socat -d -d pty,b115200 pty,b115200
  3. 查看终端 ls /dev/pts/

minicom

  1. 安装 sudo apt-get install minicom
  2. 链接虚拟终端 sudo minicom -D /dev/pts/3
  3. 以十六进制显示 minicom -D /dev/pts/1 -H
  4. 设置波特率 minicom -D /dev/pts/1 -b B115200
  5. 设置回显 Ctrl+A->Z->E
  6. 设置自动换行 Ctrl+A->W
  7. 清屏 Ctrl+A->C
  8. 退出 Ctrl+A->X

交叉编译

  1. 生成配置文件./autogen.sh
  2. 配置./configure --host=arm-linux-gnueabihf --prefix=$(pwd)/__install
  3. 编译 make(如果遇到C++版本问题请升级交叉编译器)
  4. 安装 make install
  5. 查看生成的库文件类型file libmodbus.so.5.1.0
    libmodbus.so.5.1.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=d30e9af8a0ccc675f8549abbfa88e8df5574b196, with debug_info, not stripped
  6. 将库文件放到开发板的库文件目录下
    cd /usr/lib
    mv /root/libmodbus.so.5.1.0 ./
  7. 创建软连接
    ln -s libmodbus.so.5.1.0 libmodbus.so.5

./libmodbus.exe: /lib/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found (required by ./libmodbus.exe)

Ubuntu编译

/usr/bin/ld: 找不到 -lmodbus collect2: error: ld returned 1 exit status

./a.out: error while loading shared libraries: libmodbus.so.5: cannot open shared object file: No such file or directory

将库文件的路径添加到 /etc/ld.so.conf 文件中,并运行 sudo ldconfig 命令来更新库缓存。例如,如果库文件位于 /home/lux/OpenSource/libmodbus/__install/lib 目录中,您可以将以下行添加到 /etc/ld.so.conf 文件的末尾:
/home/lux/OpenSource/libmodbus/__install/lib
保存文件后,运行 sudo ldconfig 命令。

测试

tcp_client

#include "modbus_tcp.hpp"
#include <unistd.h>int main(int argc, char *argv[])
{uint8_t read_buffer[1024];uint8_t write_buffer[1024];uint16_t read_buffer_16[3];uint16_t write_buffer_16[1024];uint8_t ret = 0;modbus::modbus_tcp modbus("192.168.2.200",60000);  //创建一个modbus_tcp对象for (int i = 0; i < 10; i++){ret = modbus.read_coil_status(0x0000, 5, read_buffer);//00 01 00 00 00 06 01   01 67 89 00 05 if (ret > 0){printf("read_coil_status:%d\r\n",ret);for (int j = 0; j < ret; j++){printf("%02x ",read_buffer[j]);}printf("\r\n");}usleep(1000*100);ret = modbus.read_input_status(0x0000, 5, read_buffer);//00 01 00 00 00 06 01    01 67 89 00 05 if (ret > 0){printf("read_input_status:%d\r\n",ret);for (int j = 0; j < ret; j++){printf("%02x ",read_buffer[j]);}printf("\r\n");}usleep(1000*100);ret = modbus.read_holding_register(0x0000, 5, read_buffer_16);//00 01 00 00 00 06 01   01 67 89 00 05if (ret > 0){printf("read_holding_register:%d\r\n",ret); for (int j = 0; j < ret; j++){printf("%02x ",read_buffer_16[j]);}printf("\r\n");}usleep(1000*100);ret = modbus.read_input_register(0x0000, 5, read_buffer_16);//00 01 00 00 00 06 01    04 67 89 00 05  if (ret > 0){printf("read_input_register:%d\r\n",ret);for (int j = 0; j < ret; j++){printf("%02x ",read_buffer_16[j]);}printf("\r\n");}usleep(1000*100);// printf("write_single_coil:%d\r\n",modbus.write_single_coil(0x0000, 0x1234));// usleep(1000*100);// printf("write_single_register:%d\r\n",modbus.write_single_register(0x0000, 0x1234));//0x06:写单个保持寄存器: 00 01 00 00 00 06 01    06 67 89 12 34// usleep(1000*100);// printf("write_multiple_coil:%d\r\n",modbus.write_multiple_coil(0x0000, 5, write_buffer));//0x0F(15):写多个线圈: 00 01 00 00 00 08 01     0F 67 89 00 05 01 1F// usleep(1000*100);// printf("write_multiple_registers:%d\r\n",modbus.write_multiple_registers(0x0000, 5,  write_buffer_16));//0x10(16):写多个保持寄存器: 00 01 00 00 00 11 01   10 67 89 00 05 0A 00 00 00 00 00 00 00 00 00 05 // usleep(1000*100);}usleep(1000*500);
}
modbus_slave

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/144373.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第1篇 目标检测概述 —(2)目标检测算法介绍

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。目标检测算法是一种计算机视觉算法&#xff0c;用于在图像或视频中识别和定位特定的目标物体。常见的目标检测算法包括传统的基于特征的方法&#xff08;如Haar特征和HOG特征&#xff09;以及基于深度学习的方法&#xff0…

[React] Context上下文的使用

文章目录 1.Context的介绍2.为什么需要Context3.Context的使用 1.Context的介绍 Context旨在为React复杂嵌套的各个组件提供一个生命周期内的统一属性访问对象&#xff0c;从而避免我们出现当出现复杂嵌套结构的组件需要一层层通过属性传递值得问题。 Context是为了提供一个组…

CTF 入门指南:从零开始学习网络安全竞赛

文章目录 写在前面CTF 简介和背景CTF 赛题类型介绍CTF 技能和工具准备好书推荐 写作末尾 写在前面 CTF比赛是快速提升网络安全实战技能的重要途径&#xff0c;已成为各个行业选拔网络安全人才的通用方法。但是&#xff0c;本书作者在从事CTF培训的过程中&#xff0c;发现存在几…

网络爬虫--伪装浏览器

从用户请求的Headers反反爬 在访问某些网站的时候&#xff0c;网站通常会用判断访问是否带有头文件来鉴别该访问是否为爬虫&#xff0c;用来作为反爬取的一种策略。很多网站都会对Headers的User-Agent进行检测&#xff0c;还有一部分网站会对Referer进行检测&#xff08;一些资…

阿里云 Oss 权限控制

前言 最近公司的私有 Oss 服务满了&#xff0c;且 Oss 地址需要设置权限&#xff0c;只有当前系统的登录用户才能访问 Oss 下载地址。一开始想着用 Nginx 做个转发来着&#xff0c;Nginx 每当检测当前请求包含特定的 Oss 地址就转发到我们的统一鉴权接口上去&#xff0c;但是紧…

ElementUI动态树,数据表格以及分页的实现

目录 前言 一. ElementUI动态树 二. 数据表格和分页 三. 后端代码 service层 controller层 前言 在上一篇博客中实现了左侧菜单栏&#xff0c;在此基础上将它变为动态的&#xff0c;即动态的展示数据库的数据。还有数据表格的实现以及分页。&#xff08;纯代码分享&#…

SpringCloud + SpringGateway 解决Get请求传参为特殊字符导致400无法通过网关转发的问题

title: “SpringCloud SpringGateway 解决Get请求传参为特殊字符导致400无法通过网关转发的问题” createTime: 2021-11-24T10:27:5708:00 updateTime: 2021-11-24T10:27:5708:00 draft: false author: “Atomicyo” tags: [“tomcat”] categories: [“java”] description: …

燃气安全如何保障?万宾燃气管网监测系统时刻感知管网运行态势

近年来随着我国城镇化建设的加快&#xff0c;燃气已经成为每个家庭的必需品。然而&#xff0c;每年夏季频繁发生的燃气爆炸事故&#xff0c;已经严重危害人民生命财产安全危害社会公共安全和公共利益。为了保障燃气安全运行&#xff0c;近日&#xff0c;许多城市都在大力推进燃…

wepack打包生产环境使用http-proxy-middleware做api代理转发的方法

首先安装http-proxy-middleware依赖&#xff0c;这个用npm和yarn安装都可以。 然后在express服务器的代码增加如下内容&#xff1a; const express require("express"); const app express(); const { createProxyMiddleware, fixRequestBody, } require("h…

WebGL笔记:绘制多个点,三角形,以及画各种不同的线条

绘制多点 1 &#xff09; WebGL 缓冲区 我们在用js定点位的时候&#xff0c;肯定是要建立一份顶点数据的&#xff0c;这份顶点数据是给着色器的&#xff0c;因为着色器需要这份顶点数据绘图然而&#xff0c;我们在js中建立顶点数据&#xff0c;着色器肯定是拿不到的&#xff…

ElementUI之首页导航与左侧菜单

目录 一、Mock 1.1 什么是Mock.js 1.2 安装与配置 1.2.1 安装mock.js 1.2.2 引入mock.js 1.3 mock.js使用 1.3.1 定义测试数据文件 1.3.2 mock拦截Ajax请求 1.3.3 界面代码优化 二、总线 2.1 定义 2.2 类型分类 2.3 前期准备 2.4 配置组件与路由关系 2.4.1 配置…

arduino - UNO-R3,mega2560-R3,NUCLEO-H723ZG的arduino引脚定义区别

文章目录 arduino - UNO-R3,mega2560-R3,NUCLEO-H723ZG的引脚定义区别概述笔记NUCLEO-H723ZGmega2560-R3UNO-R3经过比对, 这2个板子(NUCLEO-H723ZG, mega2560-R3)都是和UNO-R3的arduino引脚定义一样的.mega2560-r3和NUCLEO-H723ZG的区别补充arduino uno r3的纯数字IO和模拟IO作…

HTTP 协商缓存 Last-Modified,If-Modified-Since

浏览器第一次跟服务器请求一个资源&#xff0c;服务器在返回这个资源的同时&#xff0c;在respone header加上Last-Modified属性&#xff08;表示这个资源在服务器上的最后修改时间&#xff09;&#xff1a; ----------------------------------------------------------------…

【Java 进阶篇】MySQL 数据库备份与还原

MySQL 是一款常用的关系型数据库管理系统&#xff0c;用于存储和管理数据。在数据库应用中&#xff0c;数据备份和还原是非常重要的操作&#xff0c;用于保护数据免受意外删除、损坏或数据丢失的影响。本文将详细介绍如何在 MySQL 中进行数据库备份和还原操作&#xff0c;包括常…

5+铁死亡+分型+WGCNA+机器学习分析

今天给同学们分享一篇铁死亡分型WGCNA机器学习的生信文章“Identification of ferroptosis-related molecular clusters and genes for diabetic osteoporosis based on the machine learning”&#xff0c;这篇文章于2023年8月14日发表在Front Endocrinol (Lausanne)期刊上&am…

Swift 周报 第三十八期

文章目录 前言新闻和社区苹果自研调制解调器芯片受挫&#xff1a;速度太慢容易过热&#xff0c;落后高通 3 年App Store 现已接受适用于最新版操作系统的 App 和游戏提交 提案通过的提案正在审查的提案驳回的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组…

redis主从从,redis-7.0.13

redis主从从&#xff0c;redis-7.0.13 下载redis安装redis安装redis-7.0.13过程报错1、没有gcc&#xff0c;报错2、没有python3&#xff0c;报错3、[adlist.o] 错误 127 解决安装报错安装完成 部署redis 主从从结构redis主服务器配置redis启动redis登录redisredis默认是主 redi…

DEM格式转换:转换NSDTF-DEM国标数据格式为通用格式,使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。

DEM格式转换&#xff1a;转换NSDTF-DEM国标数据格式为通用格式&#xff0c;使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。 *.dem是一种比较常见的DEM数据格式&#xff0c;其有两种文件组织方式&#xff0c;即NSDTF-DEM和USGS-DEM。 &#xff08;1&#xff09;NSDT…

【Linux】网络原理

文章目录 &#x1f4d6; 前言1. 计算机内部的交流1.1 计算机之间的交流&#xff1a; 2. 协议2.1 网络分层&#xff1a;2.2 以打电话为例&#xff1a;2.3 OSI七层模型&#xff1a;2.4 TCP/IP&#xff1a; 3. 操作系统与网络的关系4. 报头与解包4.1 报头的作用&#xff1a; 5. 局…

IDEA Debug技巧大全,看完就能提升工作效率

作者简介 目录 1.行断点 2.方法断点 3.异常断点 4.字段断点 5.条件表达式 1.行断点 行断点就是平时我们在代码行旁边单击鼠标打上的断点&#xff0c;这个没有什么好说的。关键点在于很多人不知道的&#xff0c;行断点其实是可以右击选择是对改行的全部调用都生效&#xf…