Java使用RXTX串口通讯遇到的一些问题

自己做开发,利用java使用rxtx的一些包调用c库来进行跟设备进行通讯一点点经验:

有关需要引入的库文件等操作网络上能搜很多的资料:

引入:https://blog.csdn.net/weixin_44613063/article/details/98593433

  • 采用rxtxcomm包:
<dependency>
    <groupId>org.bidib.jbidib.org.qbang.rxtx</groupId>
    <artifactId>rxtxcomm</artifactId>
    <version>2.2</version>
</dependency>

遇到的问题:

不多说直接上代码:

public static SerialPort openSerialPort(SerialPortParameter parameter, int timeout)
        throws NoSuchPortException, PortInUseException, UnsupportedCommOperationException {
    //通过端口名称得到端口
    CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(parameter.getSerialPortName());
    //打开端口,(自定义名字,打开超时时间)
    CommPort commPort = portIdentifier.open(parameter.getSerialPortName(), timeout);
    //判断是不是串口
    if (commPort instanceof SerialPort) {
        SerialPort serialPort = (SerialPort) commPort;
        //设置串口参数(波特率,数据位8,停止位1,校验位无)
        serialPort.setSerialPortParams(parameter.getBaudRate(), parameter.getDataBits(), parameter.getStopBits(), parameter.getParity());
        return serialPort;
    } else {
        //是其他类型的端口
        throw new NoSuchPortException();
    }
}

当我调用CommPortIdentifier.getPortIdentifier(parameter.getSerialPortName())  比如我parameter.getSerialPortName()的值为COM1,当我对另外的串口使用工具AccessPort做监视的时候,会发现它会对其他的串口进行开启和关闭一次,这样很容易导致

jvm崩掉,程序无法正常使用

问题原因(网上说法不一):第一种:可能因为你现在阻塞导致jvm崩掉

                                                   第二种:win10的重叠操作

(引用)RXTX在Win10上不能使用,一调用write就报错。RXTX已经超过10年没有更新了。我觉得是Win10的锅,因为Win10的重叠操作会报错,用C调用API打开串口,用了重叠操作就各种不正常,随机出错,只能用同步方式打开。RXTX可能是基于重叠操作的,所以在Win10就不行了。
如何重新建立一个串口读写的接口。
首先,用同步方式打开串口,不要用异步操作,那会带来随机问题。
然后,超时参数除最短的那个是-1,其它都设置成0。这样可以像InputStream那样进行非阻塞操作。顺带一提,这几个参数有关联关系,设得不好可能会卡在那里不动,所以干脆设成非阻塞无延时最简单了。
流控默认是关的,不可能会有用流控的设备,所以不需要管它。只需要开放输入缓冲、输出缓冲、波特率、字节长度、校验、停止位就行了。
在java创建一个后台线程读串口,然后用一个阻塞队列做应用层的缓冲区。
有了缓冲区,就可以做数据拼接。数据拼接有三个要素:1、超时,可以用阻塞队列的poll方法;2、最大长度,在后台线程进行最大长度检查;3、校验条件,校验条件是一个Lambda对象,每次接收到数据包后调用这个Lambda判断是否达到校验要求,如果达到要求,则直接退出,不再等待超时,也不等待数据达到数量上限。

解决方式:我换用了purejavacomm 的jar包

<dependency>
    <groupId>com.github.purejavacomm</groupId>
    <artifactId>purejavacomm</artifactId>
    <version>1.0.2.RELEASE</version>
</dependency>

在之前rxtx的基础上 代码都不用改动的,没有出现之前的那种问题了

朋友也推荐了一些其他的方式,暂时还没使用过:jSerialComm

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值