Netty实现串口通信示例 - GuestZ - 博客园

目前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
接收到:来打昆特牌吧

复制代码; "复制代码")


原网址: 访问
创建于: 2023-09-13 16:22:33
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论