【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
MINA作为优秀的网络应用开发框架,也集成了关于串口通讯的开发,其集成使用的为RXTX串口开发框架,RXTX为各操作系统下的兼容javax.comm串口通讯包API的实现,若不甚了解或遇安装问题请参考我另一篇博文:http://blog.csdn.net/cheng157507947/article/details/43764623 由于我原先使用过RXTX做过串口开发测试,环境并无问题,windows7 64位下创建了两个虚拟串口用于串口调试,linux下也是使用xgcom串口调试工具,其环境问题不在赘述。
MINA官网中有对Serial Transport的大致说明和样例,可参考: http://mina.apache.org/mina-project/userguide/ch6-transports/serial-transport.html(一些需要注意的问题官网中也有解释) 在开发测试之前,除RXTX环境外,需知在MINA提供的2.0.9的基础包中并不包含Serial开发包,在上述连接中已有标明,并已提供了下载地址,开发环境中需加入mina-transport-serial jar。 此外MINA框架使用slf4j,在不做任何处理的情况下会报出
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”. SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
解决方法可参考另一博文:http://blog.csdn.net/cheng157507947/article/details/45039309
下面即可开始Serial通讯开发,根据官网介绍,串口开发只有客户端,不存在服务端代码,即:
IoConnector connector = new SerialConnector();
//添加数据解析Filter connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MessageCodecFactory()));
//添加事件处理handler connector.setHandler(new SerialHandler());
SerialAddress portAddress = new SerialAddress("COM1", 9600, DataBits.DATABITS_8, StopBits.BITS_1, Parity.NONE, FlowControl.NONE);
ConnectFuture future = connector.connect(portAddress); future.await(); IoSession session = future.getSession(); session.write("00"); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 这里除部分Serial地址设置方法不同外,其余与MINA框架客户端开发并无不同,编写自己的处理方法即可,不了解MINA框架的处理方式可参考另一篇博文http://blog.csdn.net/cheng157507947/article/details/44099637
串口通讯的注意点: 1.需正确添加SerialAddress参数值,可参考RXTX中的串口获得。 2.在我测试的串口通讯中,原先使用的TextLineCodecFactory Filter并不适用,原因为串口通讯中多数使用指定协议(如ModBus协议),使用byte传输16进制命令,形如“01 03 00 01 00 01 D5 CA”。 可使用自定义IoFilter用于数据的编码和解码: 定义编码工厂类:
public class MessageCodecFactory implements ProtocolCodecFactory {
private final MessageEncoder encoder;
private final MessageDecoder decoder;
public MessageCodecFactory() {
this.encoder = new MessageEncoder();
this.decoder = new MessageDecoder();
}
[@Override](https://my.oschina.net/u/1162528)
public ProtocolDecoder getDecoder(IoSession session) throws Exception {
return decoder;
}
[@Override](https://my.oschina.net/u/1162528)
public ProtocolEncoder getEncoder(IoSession session) throws Exception {
return encoder;
}
} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 编码器(向串口发送数据时的数据编码加工):
public class MessageEncoder extends ProtocolEncoderAdapter {
@SuppressWarnings("unused")
private final static Logger log = LoggerFactory.getLogger(MessageDecoder.class);
[@Override](https://my.oschina.net/u/1162528)
public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
if(message instanceof ...){
IoBuffer buffer = IoBuffer.allocate(100).setAutoExpand(true);
...
byte[] send = ...
buffer.put(send);
buffer.flip();
session.write(buffer);
}
}
} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 解码器(接收串口数据时的数据解码加工):
public class MessageDecoder extends CumulativeProtocolDecoder {
private static Logger log = LoggerFactory.getLogger(MessageDecoder.class);
...
[@Override](https://my.oschina.net/u/1162528)
protected boolean doDecode(IoSession session, IoBuffer in,
ProtocolDecoderOutput out) throws Exception {
byte[] input = new byte[in.limit()];
in.get(input, 0, input.length);
log.info("接收:{}", ByteUtil.toHexString(input));
...
out.write(...);
...
return true;
}
return false;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 具体处理按照项目要求,不再贴详细代码 ———————————————— 版权声明:本文为CSDN博主「指尖张扬」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/cheng157507947/article/details/44417927
来源:oschina
链接:https://my.oschina.net/u/2963604/blog/3154899