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

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

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

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

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

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

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

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

一、导入依赖

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

kotlin 复制代码
implementation("org.github.jeadyx.modbus:simple-modbus-master:1.0")

添加之后别忘记sync项目

二、使用依赖

  1. 初始化串口
kotlin 复制代码
SimpleModbus.init("/dev/ttyS1", 9600)
  1. 创建读写请求
kotlin 复制代码
// 创建写多个寄存器请求,以写两个寄存器为例
// 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. 发送刚创建的请求
kotlin 复制代码
// 以读寄存器为例
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说明
kotlin 复制代码
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,点赞,分享。

相关推荐
星河耀银海几秒前
C++ 运算符重载:自定义类型的运算扩展
android·java·c++
阿巴斯甜38 分钟前
Activity 之间大量数据传递有哪些方案?
android
阿巴斯甜40 分钟前
必看1
android
帅次3 小时前
副作用 API:LaunchedEffect、DisposableEffect、SideEffect
android·compose·disposable·sideeffect·launched·ondispose
流年如夢3 小时前
单链表的应用 --> 简单通讯录的实现
android·数据结构·链表
Hical_W3 小时前
Hical 踩坑实录五部曲(二):MSVC / GCC / Clang 三平台 C++20 编译差异
linux·windows·经验分享·嵌入式硬件·macos·开源·c++20
带娃的IT创业者8 小时前
Valve 开源 Steam Controller:当硬件设计遇上开源精神,一场游戏外设的革命才刚刚开始
游戏·开源·开源硬件·cad·知识共享·valve·游戏外设
计算机魔术师9 小时前
【技术趣闻 | AI Agent Skill】为什么 AI 总绕着同一个脑回路转?多语言思维采样:让 Agent 从“给一个答案”变成“给一组方案”
开源
用户86022504674729 小时前
Jetpack ViewModel 入门与实践
android
随遇丿而安9 小时前
第3周:按钮这件小事,真正麻烦的是“点完以后”
android