java串口jdk1.8以后版本win10 64位系统bug修复库nrjavaserial-3.15.0
分享如果使用java+RXTX进行串口开发的时候出现如下类似 [rxtxSerial.dll+0x4465] 的报错是可以替换下面的jar包可以解决这个问题,java源代码里面引用的类不需要更改,经本人测试环境是win10+jdk11通过,作者是JDK14+WIN10
RXTX在win系统下仅适合JDK1.8(含)以下版本正常使用。linux系统下RXTX+jdk1.8以上版本暂时没返现有这类型报错报错都是你自身使用不当造成,当然不想麻烦直接替换下面的nrjavaserial-3a包也可以(本人还没linux系统测试过你们可以自身测试后再生产)。另外我只测试一个串口的情况下,多串口还为测试过自行测试,都是免费产品不做过多研究。
这是另一个文章低于这类型错误的一种说法,没有验证本人知识有限有能力及时间爱好的朋友可以自行深究。
问题原因(网上说法不一):
第一种:可能因为你现在阻塞导致jvm崩掉
第二种:win10的重叠操作
(引用)RXTX在Win10上不能使用,一调用write就报错。RXTX已经超过10年没有更新了。我觉得是Win10的锅,因为Win10的重叠操作会报错,用C调用API打开串口,用了重叠操作就各种不正常,随机出错,只能用同步方式打开。RXTX可能是基于重叠操作的,所以在Win10就不行了。
如何重新建立一个串口读写的接口。
首先,用同步方式打开串口,不要用异步操作,那会带来随机问题。
然后,超时参数除最短的那个是-1,其它都设置成0。这样可以像InputStream那样进行非阻塞操作。顺带一提,这几个参数有关联关系,设得不好可能会卡在那里不动,所以干脆设成非阻塞无延时最简单了。
流控默认是关的,不可能会有用流控的设备,所以不需要管它。只需要开放输入缓冲、输出缓冲、波特率、字节长度、校验、停止位就行了。
在java创建一个后台线程读串口,然后用一个阻塞队列做应用层的缓冲区。
有了缓冲区,就可以做数据拼接。数据拼接有三个要素:1、超时,可以用阻塞队列的poll方法;2、最大长度,在后台线程进行最大长度检查;3、校验条件,校验条件是一个Lambda对象,每次接收到数据包后调用这个Lambda判断是否达到校验要求,如果达到要求,则直接退出,不再等待超时,也不等待数据达到数量上限
下面是本文重点的作者原文
import gnu.io.NRSerialPort; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; public class Test { public static void main(String[] args) { for(String s:NRSerialPort.getAvailableSerialPorts()){ System.out.println("Availible port: "+s); } String port = "COM1"; int baudRate = 9600; NRSerialPort serial = new NRSerialPort(port, baudRate); serial.connect(); DataInputStream ins = new DataInputStream(serial.getInputStream()); DataOutputStream outs = new DataOutputStream(serial.getOutputStream()); byte b = 0; while (true) { try { b = (byte) ins.read(); // System.out.println(b); if(b!=-1)outs.write(b); } catch (IOException e) { e.printStackTrace(); } } // serial.disconnect(); } }
原文地址:https://blog.csdn.net/qilanjie1/article/details/104995493/
回帖 ( 0 )