自己做开发,利用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