java?串口工具jSerialComm示例詳解
由于項(xiàng)目之前用的串口工具RXTX只支持到j(luò)dk1.8 然后項(xiàng)目目前用到的jdk是13的 所以在網(wǎng)上找了一下 找到了這個(gè)jSerialComm 目前使用是支持13及1.8的 沒(méi)做其它jdk版本測(cè)試
引入jar包,github地址:http://fazecast.github.io/jSerialComm/
<!--串口連接工具--> <dependency> <groupId>com.fazecast</groupId> <artifactId>jSerialComm</artifactId> <version>[2.0.0,3.0.0)</version> </dependency>
連接工具api文檔地址:com.fazecast.jSerialComm (jSerialComm 2.9.0 API)
串口操作:
package com.jinfu.core; import com.fazecast.jSerialComm.SerialPort; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @Slf4j public class SerialPortManager { //查找所有可用端口 public static List<String> findPorts() { // 獲得當(dāng)前所有可用串口 SerialPort[] serialPorts = SerialPort.getCommPorts(); List<String> portNameList = new ArrayList<String>(); // 將可用串口名添加到List并返回該List for(SerialPort serialPort:serialPorts) { portNameList.add(serialPort.getSystemPortName()); } //去重 portNameList = portNameList.stream().distinct().collect(Collectors.toList()); return portNameList; } /** * 打開串口 * * @param portName 端口名稱 * @param baudRate 波特率 * @return 串口對(duì)象 */ public static SerialPort openPort(String portName, Integer baudRate) { SerialPort serialPort = SerialPort.getCommPort(portName); if (baudRate != null) { serialPort.setBaudRate(baudRate); } if (!serialPort.isOpen()) { //開啟串口 serialPort.openPort(1000); }else{ return serialPort; } // 設(shè)置一下串口的波特率等參數(shù) // 數(shù)據(jù)位:8 // 停止位:1 // 校驗(yàn)位:None serialPort.setFlowControl(SerialPort.FLOW_CONTROL_DISABLED); serialPort.setComPortParameters(baudRate, 8, SerialPort.ONE_STOP_BIT, SerialPort.NO_PARITY); serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_BLOCKING | SerialPort.TIMEOUT_WRITE_BLOCKING, 1000, 1000); return serialPort; } /** * 關(guān)閉串口 * @param serialPort 待關(guān)閉的串口對(duì)象 */ public static void closePort(SerialPort serialPort) { if (serialPort != null && serialPort.isOpen()){ serialPort.closePort(); } } /** * 往串口發(fā)送數(shù)據(jù) * @param serialPort 串口對(duì)象 * @param content 待發(fā)送數(shù)據(jù) */ public static void sendToPort(SerialPort serialPort,byte[] content) { if (!serialPort.isOpen()) { return; } serialPort.writeBytes(content, content.length); } /** * 從串口讀取數(shù)據(jù) * @param serialPort 當(dāng)前已建立連接的SerialPort對(duì)象 * @return 讀取到的數(shù)據(jù) */ public static byte[] readFromPort(SerialPort serialPort) { byte[] reslutData = null; try { if (!serialPort.isOpen()){return null;}; int i=0; while (serialPort.bytesAvailable() > 0 && i++ < 5) Thread.sleep(20); byte[] readBuffer = new byte[serialPort.bytesAvailable()]; int numRead = serialPort.readBytes(readBuffer, readBuffer.length); if (numRead > 0) { reslutData = readBuffer; } } catch (InterruptedException e) { e.printStackTrace(); } return reslutData; } /** * 添加監(jiān)聽器 * @param serialPort 串口對(duì)象 * @param listener 串口存在有效數(shù)據(jù)監(jiān)聽 */ public static void addListener(SerialPort serialPort, DataAvailableListener listener) { try { // 給串口添加監(jiān)聽器 serialPort.addDataListener(new SerialPortListener(listener)); } catch (Exception e) { e.printStackTrace(); } } }
當(dāng)前串口工具是自帶一個(gè)監(jiān)聽的方法SerialPortDataListener
目前是寫了一個(gè)回調(diào)來(lái)監(jiān)聽串口工具的監(jiān)聽方法 這樣做 是為了混淆 混淆后 串口工具自帶的監(jiān)聽方法無(wú)法被其它地方調(diào)用
監(jiān)聽:
import com.fazecast.jSerialComm.SerialPort; import com.fazecast.jSerialComm.SerialPortDataListener; import com.fazecast.jSerialComm.SerialPortEvent; import lombok.extern.slf4j.Slf4j; /** * 串口監(jiān)聽 */ @Slf4j public class SerialPortListener implements SerialPortDataListener { private DataAvailableListener mDataAvailableListener; public SerialPortListener(DataAvailableListener mDataAvailableListener) { this.mDataAvailableListener = mDataAvailableListener; } @Override public int getListeningEvents() { //必須是return這個(gè)才會(huì)開啟串口工具的監(jiān)聽 return SerialPort.LISTENING_EVENT_DATA_AVAILABLE; } public void serialEvent(SerialPortEvent serialPortEvent) { if (mDataAvailableListener != null) { mDataAvailableListener.dataAvailable(); } } } /** * 串口存在有效數(shù)據(jù)監(jiān)聽 */ public interface DataAvailableListener { /** * 串口存在有效數(shù)據(jù) */ void dataAvailable(); }
調(diào)用示例:
/** * @throws PortInUseException 串口已經(jīng)被占用 */ public static void main(String[] args) throws PortInUseException {//打開串口,返回一個(gè)串口對(duì)象 參數(shù):串口號(hào) 波特率 SerialPort serialPort = SerialPortManager.openPort("COM1", 10000); //給當(dāng)前串口對(duì)象設(shè)置監(jiān)聽器 SerialPortManager.addListener(serialPort, new DataAvailableListener() { @Override public void dataAvailable() { //當(dāng)前監(jiān)聽器監(jiān)聽到的串口返回?cái)?shù)據(jù) back byte[] back = SerialPortManager.readFromPort(serialPort); } }); //當(dāng)前向串口發(fā)送的數(shù)據(jù)(模擬假數(shù)據(jù)) byte[] content = new byte[10]; //向當(dāng)前串口發(fā)送數(shù)據(jù) SerialPortManager.sendToPort(serialPort,content); }
到此這篇關(guān)于java串口工具jSerialComm的文章就介紹到這了,更多相關(guān)java串口jSerialComm內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 生成隨機(jī)單據(jù)號(hào)的實(shí)現(xiàn)示例
本文主要介紹了Java 生成隨機(jī)單據(jù)號(hào)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09最簡(jiǎn)單的MyBatis Plus的多表聯(lián)接、分頁(yè)查詢實(shí)現(xiàn)方法
這篇文章主要介紹了最簡(jiǎn)單的MyBatis Plus的多表聯(lián)接、分頁(yè)查詢實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Java自定義注解實(shí)現(xiàn)Redis自動(dòng)緩存的方法
本篇文章主要介紹了Java自定義注解實(shí)現(xiàn)Redis自動(dòng)緩存的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04SpringBoot獲取ApplicationContext的3種方式
這篇文章主要為大家詳細(xì)介紹了SpringBoot獲取ApplicationContext的3種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09List集合對(duì)象中按照不同屬性大小排序的實(shí)例
下面小編就為大家?guī)?lái)一篇List集合對(duì)象中按照不同屬性大小排序的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03SpringBoot+MySQL+Jpa實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增刪改查和分頁(yè)詳解
這篇文章主要介紹了SpringBoot+MySQL+Jpa實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增刪改查和分頁(yè)詳解,需要的朋友可以參考下2020-02-02深度deepin安裝以及jdk、tomcat、Nginx安裝教程
這篇文章主要給大家介紹了關(guān)于深度deepin安裝以及jdk、tomcat、Nginx安裝的相關(guān)資料,按照文中介紹的方法可以輕松的實(shí)現(xiàn)安裝,對(duì)大家的工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01