java?串口工具jSerialComm示例詳解
由于項(xiàng)目之前用的串口工具RXTX只支持到j(luò)dk1.8 然后項(xiàng)目目前用到的jdk是13的 所以在網(wǎng)上找了一下 找到了這個(gè)jSerialComm 目前使用是支持13及1.8的 沒做其它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)來監(jiān)聽串口工具的監(jiān)聽方法 這樣做 是為了混淆 混淆后 串口工具自帶的監(jiān)聽方法無法被其它地方調(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中“1000==1000”為false而”100==100“為true
在日常編程中,我們經(jīng)常遇到一些看似簡單卻隱藏著復(fù)雜邏輯的問題,這篇文章主要介紹了解釋為什么Java中“1000==1000”為false而”100==100“為true,需要的朋友可以參考下2024-01-01
Java實(shí)戰(zhàn)寵物醫(yī)院預(yù)約掛號(hào)系統(tǒng)的實(shí)現(xiàn)流程
只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+JSP+Spring+SpringBoot+MyBatis+html+layui+maven+Mysql實(shí)現(xiàn)一個(gè)寵物醫(yī)院預(yù)約掛號(hào)系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2022-01-01
SpringBoot自動(dòng)裝配注解的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot自動(dòng)裝配注解的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-04-04
springboot之security?FilterSecurityInterceptor的使用要點(diǎn)記錄
這篇文章主要介紹了springboot之security?FilterSecurityInterceptor的使用要點(diǎn)記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
springSecurity實(shí)現(xiàn)簡單的登錄功能
這篇文章主要為大家詳細(xì)介紹了springSecurity實(shí)現(xiàn)簡單的登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
Java實(shí)現(xiàn)快速排序和堆排序的示例代碼
這篇文章主要為大家詳細(xì)介紹了快速排序和堆排序的多種語言的實(shí)現(xiàn)(JavaScript、Python、Go語言、Java、C++),感興趣的小伙伴可以了解一下2022-12-12
生產(chǎn)者消費(fèi)者模型ThreadLocal原理及實(shí)例詳解
這篇文章主要介紹了生產(chǎn)者消費(fèi)者模型ThreadLocal原理及實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09

