一、前言
串口通信主要用于物联网设备中,采用的协议一般为ModBus协议,这是一种悠久的通信技术。在Android中的使用的通信协议如果是自己编译的话大多数会采用09年google提供的一个串口的源码(源码为C语言版本,需要自己编译成.so)。源码如下:
https://github.com/cepr/android-serialport-api
这里提供一个将源码编译成.so的参考示例(这个参考示例中java代码只有几个,使用很简单,但是没有怎么封装,需要进行再次封装才行):
https://blog.csdn.net/Mr_Tony/article/details/115208890
其实如果搜索ModBus的话就会发现另外一条技术路径。
串口通信是技术,是基于ModBus协议开发的,所以本片会稍微涉及下ModBus协议中的一部分并结合实际工作进行记录。
注意:
本文假设硬件通畅,运行逻辑没有问题
二、ModBus协议
关于ModBus协议可以具体看下百度百科了解下,本文侧重实际应用。
modbus有多种协议配置,其主要分为串口和以太网以及其他网络协议。其中串口有RTU和ASCII两个变种。以太网则是基于TCP/IP的modbus协议。主要有TCP和UDP两种使用方式。
本人在工作中采用的是RTU协议(或者modbus_rtu协议)。硬件使用RS-485。数据校验位CRC校验。
通信配置为以下:
- 波特率:9600
- 奇偶校验:N
- 数据位:8
- 停止位:1
所以发送的命令大致为以下格式:
01 06 00 0E 00 01 28 18
该内容解释如下(因为该格式为16进制,所以在实际操作中要转换进制后才能发送,不能发送成文本格式):
地址 | 功能码 | 地址高 | 地址低 | 数据高 | 数据低 | CRC高 | CRC低 |
---|---|---|---|---|---|---|---|
0x01 | 0x06 | 0x00 | 0x0E | 0x00 | 0x01 | 0x28 | 0x18 |
这行的命令意思为,查找地址为0x01的设备(注意第一个设备为0x01,0x00为广播,所有设备都会收到信息),然后执行0x06功能,然后在该设备的0x000E地址中写入0x0001数据,校验码为0x2818。
CRC校验会根据前面的数据动态计算,可以使用以下链接进行在线计算:
https://www.lammertbies.nl/comm/info/crc-calculation
计算结果可以查看CRC-16(Modbus),其结果是从低到高的,所以在实际应用中需要反着写。
结果如下:
所以正常开发中只要根据规则计算好相应的CRC,并发送指令就可以完成功能了。
三、线圈、寄存器
在实际工作中有些时候厂家提供的使用说明是线圈数、寄存器数、输入数等跟硬件相关的名词。其实这些数据在等同于上文表格中的第5位(数据高)、第6位(数据低)。执行不同功能时候,该数据位则为不同的位置,比如0x01表示读取线圈状态,则第5位和第6位则为线圈数。0x02表示输入状态,则第5位和第6位则表示输入数。详细解释可以参考:https://www.lammertbies.nl/comm/info/modbus
参考示例如下:
代码 | 描述 |
---|---|
01 | 读取线圈状态 |
02 | 读取输入状态 |
03 | 读取保持寄存器 |
04 | 读取输入寄存器 |
05 | 强制单线圈 |
06 | 预置单寄存器 |
07 | 读取异常状态 |
15 | 强制多个线圈 |
16 | 预置多个寄存器 |
17 | 报告从站 ID |
根据上述表格在具体开发中就可以进行灵活使用。
四、第三方开发资源
1、modbus的第三方库j2mod(主要用于TCP/UDP的方式进行串口通信):
https://github.com/steveohara/j2mod
2、串口通信的库(使用RTU或者ASCII方式通信,这个会简单点)
http://fazecast.github.io/jSerialComm/
3、modbus使用库jlibmodbus(这个在github上面资料也算是比较多):
https://github.com/kochedykov/jlibmodbus
4、modbus4j(很有名,但是使用说明没怎么找到,需要自己去看源码)
https://github.com/infiniteautomation/modbus4j
五、参考链接:
- modbus官网: https://modbus.org/
- modbus接口教程: https://www.lammertbies.nl/comm/info/modbus
- modbus入门篇,详细介绍: http://www.elecfans.com/rengongzhineng/596297.html
- 在线进制转换: https://tool.oschina.net/hexconvert/
- 在线CRC计算: https://www.lammertbies.nl/comm/info/crc-calculation
- 在线CRC计算: http://www.ip33.com/crc.html
- crc16校验码计算java代码: https://blog.csdn.net/u013767488/article/details/81200530
- Java实现ModbusTCP通信: https://www.cnblogs.com/ioufev/p/10831289.html