Netty实现串口通信示例


目前Netty的OIO基本废弃,串口也在过期范围,暂时没找到替代方法,先凑合用

1.依赖

RXTX for Java (fizzed.com)

<dependency>
  <groupId>io.netty</groupId>
  <artifactId>netty-all</artifactId>
  <version>4.1.70.Final</version>
</dependency>

 

2. RxtxClient.java

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.*;import io.netty.handler.codec.LineBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

import java.nio.charset.StandardCharsets;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executors;

/**
 * TODO
 *
 * @author GuestZ
 * @version 1.0
 * @date 2021/11/9 11:54
 */
public class RxtxClient {

    public void createRxtx(RxtxClientHandler handler,String portName) throws Exception {
        System.out.println(portName);
        //串口使用阻塞io
        EventLoopGroup group = new OioEventLoopGroup();
        try {
            Bootstrap bootstrap  = new Bootstrap();
            bootstrap.group(group)
                    .channelFactory(() -> {
                        RxtxChannel rxtxChannel = new RxtxChannel();
                        rxtxChannel.config()
                                .setBaudrate(9600)
                                .setDatabits(RxtxChannelConfig.Databits.DATABITS_8)
                                .setParitybit(RxtxChannelConfig.Paritybit.NONE)
                                .setStopbits(RxtxChannelConfig.Stopbits.STOPBITS_1);
                        return rxtxChannel ;
                    })
                    .handler(new ChannelInitializer<RxtxChannel>() {
                        @Override
                        protected void initChannel(RxtxChannel rxtxChannel) {
                            rxtxChannel.pipeline().addLast(
                                    new LineBasedFrameDecoder(60000),
                                    new StringEncoder(StandardCharsets.UTF_8),
                                    new StringDecoder(StandardCharsets.UTF_8),
                                    handler
                            );
                        }
                    });

            ChannelFuture f = bootstrap.connect(new RxtxDeviceAddress(portName)).sync();
            f.channel().closeFuture().sync();
        } finally {
            group.shutdownGracefully();
        }
    }


    public void start(RxtxClientHandler handler,String portName){
        CompletableFuture.runAsync(()->{
            try {
                //阻塞的函数
                createRxtx(handler,portName);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, Executors.newSingleThreadExecutor());//不传默认使用ForkJoinPool,都是守护线程
    }

}

3.RxtxClientHandler.java

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

/**
 * TODO
 *
 * @author GuestZ
 * @version 1.0
 * @date 2021/11/9 12:01
 */
public class RxtxClientHandler extends SimpleChannelInboundHandler<String> {

    private ChannelHandlerContext ctx;
    public ChannelHandlerContext getCtx() {
        return ctx;
    }
    public void setCtx(ChannelHandlerContext ctx) {
        this.ctx = ctx;
    }


    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        ctx.writeAndFlush("success\n");
        this.ctx = ctx;
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        System.out.println("接收到:"+msg);
        //ctx.writeAndFlush("已收到\n");
        //ctx.close();
    }

    public void write(String msg){
        if(ctx!=null){
            ctx.writeAndFlush(msg);
        }
    }

}

4.测试类

import java.util.Scanner;

/**
 * COM1测试
 *
 * @author GuestZ
 * @version 1.0
 * @date 2021/11/9 11:04
 */
public class TestCom1 {


    public static void main(String[] args) throws Exception {
        RxtxClient rxtxClient = new RxtxClient();
        RxtxClientHandler handler = new RxtxClientHandler();
        rxtxClient.start(handler,"COM1");

        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNextLine()){
            String line = scanner.nextLine();
            handler.write(line+"\n");
        }

    }
}
/**
* TODO
*
* @author GuestZ
* @version 1.0
* @date 2021/11/9 12:02
*/
public class TestCom2 {

public static void main(String[] args) throws Exception {
RxtxClient rxtxClient1 = new RxtxClient();
RxtxClientHandler handler2 = new RxtxClientHandler();
rxtxClient1.start(handler2,"COM2");


Scanner scanner = new Scanner(System.in);

while (scanner.hasNextLine()){
String line = scanner.nextLine();
handler2.write(line+"\n");
}
}
}
 

5

TestCom1
来打昆特牌吧
接收到:
 
 
TestCom2
接收到:来打昆特牌吧 好
 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM