[开源] 安卓系统发送modbus协议到硬件设备下位机

news2024/9/24 5:31:16

最近是在研究安卓板子上的modbus通信,于是写了这个maven依赖。


项目中主要用到的功能是读写寄存器,所以依赖中重点测试了读写多个寄存器的协议。


另外你可以自定义协议pdu交给程序进行封装及发送。


如果使用中发现了什么问题,可以到仓库添加issue,提交你的代码


Github:https://github.com/jeadyx/AndroidSimpleModbusMaster
Gitee:https://gitee.com/jeadyx/AndroidSimpleModbusMaster


下面简单介绍下如何使用该依赖

一、导入依赖

添加依赖项到项目的build.gradle.kts

implementation("org.github.jeadyx.modbus:simple-modbus-master:1.0")

添加之后别忘记sync项目

二、使用依赖

  1. 初始化串口
SimpleModbus.init("/dev/ttyS1", 9600)
  1. 创建读写请求
// 创建写多个寄存器请求,以写两个寄存器为例
// 0x10: 从机地址
// 0x1F00: 寄存器开始地址
// ShorArray(2): 写两个寄存器,均设置为0xffff
val requestWrite = SimpleModbus.createCustomWriteRequest(0x10, ModbusFunctionCode.WriteMultipleRegisters.value, 0x1F00, ShortArray(2).apply { fill(0xffff.toShort()) })

// 创建读多个寄存器请求,以两个为例
// 0x10: 从机地址
// 0x1f: 读寄存器的开始地址
// 2: 读取两个寄存器
val requestRead = SimpleModbus.createCustomReadRequest(0x10, ModbusFunctionCode.ReadHoldingRegisters.value, 0x1F00, 2)

// 从pdu创建自定义请求
// 0x10: 从机地址
// 10: modbus指令之写多个寄存器, 每个寄存器2字节数据
// 1f00: 要写入的第一个寄存器地址
// 0002:要写入的寄存器个数
// 0001 000f: 写入这两个寄存器的数据
// 执行结果应为: 1f00寄存器写入0001; 0f01寄存器写入000f
val requestCustom = SimpleModbus.createRequestFromPduString(0x10, "101f0000020001000F")
// 要实现上面自定义请求,你还可以使用api
// fun createCustomWriteRequest(slaveAddress: Int, functionCode: Int, startAddress: Int, data: ShortArray): ByteArray

在这里插入图片描述

  1. 发送刚创建的请求
// 以读寄存器为例
val request = requestRead
// 调用写串口的接口,发送刚才创建好的请求
// res: 得到的api返回结果 类型为:SimpleModbusResponse
// res.err: 是否期间发生了错误 / 回复了错误信息
SimpleModbus.write(request) { res ->
    Log.d(TAG, "Modbus: response $res")
    if (res.err!= SimpleModbusExceptionCode.NoError) {
        // response error
    } else {
        // get response
    }
}
  1. api返回值SimpleModbusResponse说明
data class SimpleModbusResponse(
    val err: SimpleModbusExceptionCode = SimpleModbusExceptionCode.NoError, // 错误信息
    val request: ByteArray?=null, // 请求帧
    val response: ByteArray?=null, // 响应帧
    val requestPdu: ByteArray?=null, // 请求帧的pdu部分
    val responsePdu: ByteArray?=null, // 响应帧的pdu部分
    val requestTime: String="", // 请求发送的时间
    val responseTime: String="", // 响应接收的时间
)

写在最后

使用过程中的任何问题可以到git仓库反馈。
如果对你有帮助,欢迎star,点赞,分享。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DHU OJ 循环结构 整除的尾数

思路及代码 //input T int >0 //input a,b int 0< <10000 10< <100 #include<iostream> #include<iomanip> using namespace std; int main(){int T;cin >> T;while (--T > 0){int a, b;cin >> a >> b; //solution // (a*100…

Tomcat初篇

目录 Tomcat主要特点Tomcat的核心组件Tomcat使用安装Tomcat配置Tomcat启动和停止Tomcat Tomcat工作原理目录结构配置文件性能优化策略 Tomcat Apache Tomcat是一个开源的Servlet容器和Web服务器&#xff0c;广泛用于运行基于Java的Web应用程序。它实现了Java Servlet和JavaSer…

【Web开发手礼】探索Web开发的秘密(十八)-Vue2(4)部门管理页面、路由、打包部署

主要介绍了部门管理页面、路由、打包部署&#xff01;&#xff01;&#xff01; 文章目录 前言 部门管理页面 Vue路由 打包部署 打包 部署 总结 前言 主要介绍了部门管理页面、路由、打包部署&#xff01;&#xff01;&#xff01; 部门管理页面 <template><div>&…

module ‘pkgutil‘ has no attribute ‘ImpImporter‘. Did you mean_ ‘zipimporter‘_

错误详情&#xff1a; Traceback (most recent call last):File "<frozen runpy>", line 198, in _run_module_as_mainFile "<frozen runpy>", line 88, in _run_codeFile "C:\ProgramData\anaconda3\envs\py312\Scripts\mim.exe\__main…

数值计算引擎:搭建远程容器开发环境

Build VS Code Remote Docker Development Environment 大型CAE软件开发技术栈通常依赖多个第三方库&#xff0c;因此从零开始配置开发、编译、运行等环境通常较为繁琐。但随着公司的发展壮大&#xff0c;却经常需要为新加入的成员配备相应的开发环境&#xff1b;另外&#xf…

深入理解 go unsafe

往期精选文章推荐&#xff1a; 深入理解 go mapgo 常用关键字深入理解 Go 数组、切片、字符串深入理解channel深入理解 go context深入 go interface 底层原理深入理解 go reflect深入理解 go unsafe 为什么有go unsafe Go 是支持指针的语言&#xff0c;但是为了保持简洁、安…

HW高耗电提醒竞品调研

摘要 高耗电提醒通知的规则,天生存在打扰用户的特点,故在触发高耗电检测阈值还要根据是否非可感知场景,进一步修正高耗电提醒的准确率。同时消息通知的交互设计中也进行少打扰静默设计 一、功耗高耗电通知监控规则 1.1 高耗电上报规则和文案 支持的耗电类型 上报高耗电通…

CTF-mysql

整数型 输入1发现有回显 发现and11有回显12没有 判断字段数 1 order by 2 确定回显点 -1 union select 1,2 查看数据库名称 -1 union selecr 1,database() 查看数据库名 -1 union slelct group_concat(schema_name)from information_schema.schemata 查看表名 -1 union s…

MySQL进阶难度知识点分析

以下为本人在阅读《MySQL是怎样运行的&#xff1a;从根儿上理解MySQL》这本书时对一些难度和重点的笔记&#xff0c;主要用于个人学习使用&#xff0c;内容可能存在出入&#xff0c;望理性食用~ 1. sql执行流程 一条sql的执行流程大致可分为客户端获取与数据库服务器的连接&am…

使用 Hugging Face Transformers 创建文本生成模型

文本生成是自然语言处理中的一个重要任务&#xff0c;在聊天机器人、自动写作等领域有着广泛的应用。Hugging Face Transformers 是一个流行的 Python 库&#xff0c;它提供了大量预训练的模型以及API来实现各种自然语言处理任务。本文将详细介绍如何使用 Hugging Face Transfo…

Golang | Leetcode Golang题解之第338题比特位计数

题目&#xff1a; 题解&#xff1a; func countBits(n int) []int {bits : make([]int, n1)for i : 1; i < n; i {bits[i] bits[i&(i-1)] 1}return bits }

工业三防平板在数字化工厂建设中的重要趋势

在当今数字化浪潮的冲击下&#xff0c;工厂建设的数字化转型已,成为不可逆转的趋势。而在这一进程中&#xff0c;工业三防平板正逐渐斩露头角&#xff0c;发挥着越来越重要的作用。随着工业4.0理念的不断深入&#xff0c;工厂对于生产效率、质量控制、管理精细化的要求越来越高…

Elasticsearch核心概念:

2.Elasticsearch核心概念: 2.1.Lucene和Elasticsearch的关系: 1.Lucene&#xff1a;最先进、功能最强大的搜索库&#xff0c;直接基于lucene开发&#xff0c;非常复杂&#xff0c;api复杂2.Elasticsearch&#xff1a;基于lucene&#xff0c;封装了许多lucene底层功能&#xf…

2-67 基于matlab的经典数字图像处理算法仿真

基于matlab的经典数字图像处理算法仿真&#xff0c;17页文档报告。包括图像的傅里叶滤波及压缩&#xff0c;图像的DCT高通、低通滤波&#xff0c;图像直方图均衡化&#xff0c;图像平滑与锐化&#xff0c;图像的模糊化&#xff0c;哈夫曼编码等&#xff0c;以及GUI图形化界面。…

鸿蒙内核源码分析(任务管理篇) | 任务池是如何管理的?

任务即线程 在鸿蒙内核中&#xff0c;广义上可理解为一个任务就是一个线程 官方是怎么描述线程的 基本概念 从系统的角度看&#xff0c;线程是竞争系统资源的最小运行单元。线程可以使用或等待CPU、使用内存空间等系统资源&#xff0c;并独立于其它线程运行。 鸿蒙内核每个…

在Linux中进行supervisor进程守护的安装和配置

supervisor用于守护进程&#xff0c;在进程意外终止后将其重启。 supervisor没有监听内部程序和自动重启的功能。 Python-3.9.5安装 第一步&#xff0c;检查Linux系统是否自带Python。 命令&#xff1a;python --version 第二步&#xff0c;安装依赖包。 命令&#xff1a;…

Java超市收银系统(八、数据导入)

引言 当选择1时&#xff0c;程序读取 “商品信息.xls” 文件&#xff0c;将所有数据存放于product集合中&#xff0c;然后将集合中的所有数据增加到商品表中&#xff0c;增加的时候要检查每条记录的条形码在商品表中是否存在&#xff0c;若存在&#xff0c;则不需要增加到数据库…

tortoisegit下载及其使用流程

下载 官方下载链接&#xff1a;Download – TortoiseGit – Windows Shell Interface to Git 选择适合自己的电脑位数的版本&#xff1a;一般64的兼容32的 按照就不介绍了怎么开心怎么来&#xff0c;本篇暂时为了支持一位粉丝的疑惑 安装的话没有特殊配置暂不介绍&#xff0c…

Dbeaver连接达梦数据库教程(图文版)

本章教程&#xff0c;主要介绍如何用Dbeaver连接国产达梦数据库。 达梦数据库Docker部署教程参考&#xff1a;https://yang-roc.blog.csdn.net/article/details/141158807 一、Dbeaver安装包下载 下载Dbeaver&#xff1a;https://dbeaver.io/ 在这里就不演示安装过程了&#xf…

GPU驱动的大规模静态物件渲染

GPU Driven 的静态物件渲染&#xff0c;听起来很高级&#xff0c;其实具体操作很简单&#xff0c;基础就是直接调用 Graphics.DrawMeshInstancedIndirect 这个 Unity 内置接口就可以了。但我们项目对这个流程做了一些优化&#xff0c;使得支持的实体数量有大幅提升。 这套系统主…