java串口jdk1.8以后版本win10 64位系統(tǒng)bug修復(fù)庫nrjavaserial-3.15.0
分享如果使用java+RXTX進(jìn)行串口開發(fā)的時(shí)候出現(xiàn)如下類似 [rxtxSerial.dll+0x4465] 的報(bào)錯是可以替換下面的jar包可以解決這個(gè)問題,java源代碼里面引用的類不需要更改,經(jīng)本人測試環(huán)境是win10+jdk11通過,作者是JDK14+WIN10
RXTX在win系統(tǒng)下僅適合JDK1.8(含)以下版本正常使用。linux系統(tǒng)下RXTX+jdk1.8以上版本暫時(shí)沒返現(xiàn)有這類型報(bào)錯報(bào)錯都是你自身使用不當(dāng)造成,當(dāng)然不想麻煩直接替換下面的nrjavaserial-3a包也可以(本人還沒linux系統(tǒng)測試過你們可以自身測試后再生產(chǎn))。另外我只測試一個(gè)串口的情況下,多串口還為測試過自行測試,都是免費(fèi)產(chǎn)品不做過多研究。
這是另一個(gè)文章低于這類型錯誤的一種說法,沒有驗(yàn)證本人知識有限有能力及時(shí)間愛好的朋友可以自行深究。
問題原因(網(wǎng)上說法不一):
第一種:可能因?yàn)槟悻F(xiàn)在阻塞導(dǎo)致jvm崩掉
第二種:win10的重疊操作
(引用)RXTX在Win10上不能使用,一調(diào)用write就報(bào)錯。RXTX已經(jīng)超過10年沒有更新了。我覺得是Win10的鍋,因?yàn)閃in10的重疊操作會報(bào)錯,用C調(diào)用API打開串口,用了重疊操作就各種不正常,隨機(jī)出錯,只能用同步方式打開。RXTX可能是基于重疊操作的,所以在Win10就不行了。
如何重新建立一個(gè)串口讀寫的接口。
首先,用同步方式打開串口,不要用異步操作,那會帶來隨機(jī)問題。
然后,超時(shí)參數(shù)除最短的那個(gè)是-1,其它都設(shè)置成0。這樣可以像InputStream那樣進(jìn)行非阻塞操作。順帶一提,這幾個(gè)參數(shù)有關(guān)聯(lián)關(guān)系,設(shè)得不好可能會卡在那里不動,所以干脆設(shè)成非阻塞無延時(shí)最簡單了。
流控默認(rèn)是關(guān)的,不可能會有用流控的設(shè)備,所以不需要管它。只需要開放輸入緩沖、輸出緩沖、波特率、字節(jié)長度、校驗(yàn)、停止位就行了。
在java創(chuàng)建一個(gè)后臺線程讀串口,然后用一個(gè)阻塞隊(duì)列做應(yīng)用層的緩沖區(qū)。
有了緩沖區(qū),就可以做數(shù)據(jù)拼接。數(shù)據(jù)拼接有三個(gè)要素:1、超時(shí),可以用阻塞隊(duì)列的poll方法;2、最大長度,在后臺線程進(jìn)行最大長度檢查;3、校驗(yàn)條件,校驗(yàn)條件是一個(gè)Lambda對象,每次接收到數(shù)據(jù)包后調(diào)用這個(gè)Lambda判斷是否達(dá)到校驗(yàn)要求,如果達(dá)到要求,則直接退出,不再等待超時(shí),也不等待數(shù)據(jù)達(dá)到數(shù)量上限
下面是本文重點(diǎn)的作者原文
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/