Android Modbus 通讯实现

简介: Android Modbus 通讯实现

平台


Android 8.1 + RK3288

Windows 8.1 + Modbus Slave 7.31


概述


在RK3288的主板上, 支持一路RS485串口, 再将外设通过这路串口连接后, 就可以实现外设与3288的通讯, 由于手上没有外设, 所以采用模拟的方式.

连方式如下:


image.png


准备


1.买了一个RS485 U转串, 京东


image.png


2.Windows 上安装 Modbus Slave

下载地址

直接装, 压缩中已包含注册码.


3.接线:只接2根线


image.png


开始


1.接好线后, 打开Modbus Salve, 并连接.

image.png

一定要仔细核对串口的参数是否正确, 由于一开始选错了红框中的参数, 导致数据发送不过来, 主要的表现有: 数据不完整, 数据错误. 单独一个一个发正常, 连着发3个以上就出错

参考: 串口通信校验方式(even,odd,space,mark)

不管GOOGLE还是百度, 都没有人解释为什么Modbus Slave 数据接收不全, 这或许对熟悉的人来说并不算是问题的问题

image.png

主要参考下Modbus测试工具ModbusPoll与Modbus Slave使用方法

红框部分是在调试过程中, 把地址改成了1, 导致读取异常, 特此记录

image.png


寄存器部分, 很简单, 点击可修改, 数据发生变化也同样会刷新.

通俗点可以把它理解为数据库, 没有主动发送数据的功能或接口, 当通讯数据准确, 它会自动把寄存器的数据通过响应发过去.

当然, 整个数据处理过程, 均按标准的Modbus协议来


2.Android端的实现: 串口通讯

实现方式大同小异, 比如Acccord/AndroidSerialPort

和利用android-serialport-api进行串口读写操作

final UartComm uart = new UartComm();
  uart.open("/dev/ttyS0");
  int r = uart.setOpt(9600, 8, 0, 1);
  //剩下读写的实现不作细述.


3.ModBus 协议

读寄存器


SlaveId + Function + address + value + CRC

image.png

如:


//读取从 0 开始的 1e(30)个数据
SEND->01 03 00 00 00 1e c5 c2
//返回数据 3C(60)为数据长度对应上面要求的30个, 一个数据2个byte
RECV<-01 03 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7a d7


写寄存器


SlaveId + Function + address + value + CRC

image.png

//把地址0a 的值改为 1a
SEND->01 06 00 0a 00 1a 28 03
//成功后返回
RECV<-01 06 00 0a 00 1a 28 03


写多个寄存器 功能码 0x10(16)


SEND->01 10 00 1B 00 03 06 00 DF 00 BE 00 FF 23 47 
RECV->01 10 00 1B 00 03 F0 0F


更多说明请查阅: Modbus协议中文版.pdf

若无法打开, 请自行下载Modbus协议中文版【完整版】.pdf


相关文章
|
6月前
|
XML Java Android开发
Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信)
Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信)
423 0
|
Android开发
Android 使用UDP进行通讯(发送数据和接收数据)
Android 使用UDP进行通讯(发送数据和接收数据)
1878 0
|
Java Android开发
Android studio怎样修改 包名和AppId,android 加入AIDL进行底层通讯
Android studio怎样修改 包名和AppId,android 加入AIDL进行底层通讯
661 1
Android studio怎样修改 包名和AppId,android 加入AIDL进行底层通讯
|
ARouter Java Android开发
Android 组件化(二)注解与注解处理器、组件通讯
在上一篇文章中,我们完成了组件的创建、gradle统一管理、组件模式管理和切换,那么这一篇文章,我们需要做的就是组件之间的通讯了。
252 0
Android 组件化(二)注解与注解处理器、组件通讯
|
Android开发
Android Socket通讯 之 心跳消息
Android Socket通讯 之 心跳消息
194 0
Android Socket通讯 之 心跳消息
|
设计模式 Java Android开发
Android Socket通讯 之 表情列表优化、业务逻辑优化
Android Socket通讯 之 表情列表优化、业务逻辑优化
233 0
Android Socket通讯 之 表情列表优化、业务逻辑优化
|
网络协议 API Android开发
Android Socket通讯
Android Socket通讯
144 0
Android Socket通讯
|
Android开发
Android 音乐APP(六)Activity和Notification通讯
Android 音乐APP(六)Activity和Notification通讯
266 0
Android 音乐APP(六)Activity和Notification通讯