最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java串口通信JSerialComm的實(shí)現(xiàn)

 更新時(shí)間:2026年01月28日 09:09:42   作者:元正~Richarlie  
本文介紹了使用JSerialComm庫進(jìn)行Java串口通信,包括引入庫的方式、設(shè)置和操作串口、發(fā)送與接收數(shù)據(jù)以及添加數(shù)據(jù)監(jiān)聽器,具有一定的參考價(jià)值,感興趣的可以了解一下

一、引入JSerialComm包

目前網(wǎng)上的Java串口通信主要使用RXTXComm,但是這個(gè)庫已經(jīng)很久沒有更新(最近的更新似乎在2012年),并且與JavaFX集成打包時(shí)會(huì)出現(xiàn)BUG。JSerialComm是一個(gè)較新的串口通信庫,其主頁為jSerialComm (fazecast.github.io)。JSerialComm與平臺(tái)無關(guān),所以不需要配置dll文件,只需要引入jar文件即可使用,更為方便。

一、引入JSerialComm包

JSerialComm可以直接通過Maven引入,也可以復(fù)制jar包到lib目錄下直接使用。Maven的依賴可以在JSerialComm的主頁上看到,目前為:

<dependency>
   <groupId>com.fazecast</groupId>
   <artifactId>jSerialComm</artifactId>
   <version>[2.0.0,3.0.0)</version>
</dependency>

主頁上同時(shí)也有其他類型的引入方法

二、使用JSerialComm

2.1 尋找、設(shè)置、打開及關(guān)閉串口

SerialPort[] serialPorts = SerialPort.getCommPorts();//查找所有串口
for(SerialPort port:serialPorts){
    System.out.println("Port:"+port.getSystemPortName());//打印串口名稱,如COM4
    System.out.println("PortDesc:"+port.getPortDescription());//打印串口類型,如USB Serial
    System.out.println("PortDesc:"+port.getDescriptivePortName());//打印串口的完整類型,如USB-SERIAL CH340(COM4)
}
SerialPort serialPort = serialPorts[0];//獲取到第一個(gè)串口
serialPort.setBaudRate(112500);//設(shè)置波特率為112500
serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_BLOCKING | SerialPort.TIMEOUT_WRITE_BLOCKING, 1000, 1000);//設(shè)置超時(shí)
serialPort.serRTS();//設(shè)置RTS。也可以設(shè)置DTR
serialPort.setFlowControl(SerialPort.FLOW_CONTROL_DISABLED);//設(shè)置串口的控制流,可以設(shè)置為disabled,或者CTS, RTS/CTS, DSR, DTR/DSR, Xon, Xoff, Xon/Xoff等
serialPort.setComPortParameters(112500, 8, SerialPort.ONE_STOP_BIT, SerialPort.NO_PARITY);//一次性設(shè)置所有的串口參數(shù),第一個(gè)參數(shù)為波特率,默認(rèn)9600;第二個(gè)參數(shù)為每一位的大小,默認(rèn)8,可以輸入5到8之間的值;第三個(gè)參數(shù)為停止位大小,只接受內(nèi)置常量,可以選擇(ONE_STOP_BIT, ONE_POINT_FIVE_STOP_BITS, TWO_STOP_BITS);第四位為校驗(yàn)位,同樣只接受內(nèi)置常量,可以選擇 NO_PARITY, EVEN_PARITY, ODD_PARITY, MARK_PARITY,SPACE_PARITY。
if(!serialPort.isOpen){
    boolean isCommOpeded = serialPort.openPort()//判斷串口是否打開,如果沒打開,就打開串口。打開串口的函數(shù)會(huì)返回一個(gè)boolean值,用于表明串口是否成功打開了
}
serialPort.closePort();//關(guān)閉串口。該函數(shù)同樣會(huì)返回一個(gè)boolean值,表明串口是否成功關(guān)閉

2.2 發(fā)送及接收數(shù)據(jù)

數(shù)據(jù)的發(fā)送函數(shù)是SerialPort.writeBytes(byte[] bytes,int length),第一個(gè)參數(shù)是要發(fā)送的字節(jié)數(shù)組,第二個(gè)參數(shù)是要發(fā)送的數(shù)據(jù)長度。

數(shù)據(jù)的讀取函數(shù)是SerialPort.readBytes(byte[] bytes,int length),第一個(gè)參數(shù)是要將數(shù)據(jù)讀入的字節(jié)數(shù)組,第二個(gè)參數(shù)是要接收的數(shù)據(jù)長度。

可以用SerialPort.bytesAvailable來獲取目前串口中可以讀取的字符長度。如果目前沒有可讀取的數(shù)據(jù),則會(huì)返回-1

使用示例如下

if(serialPort.isOpen()){
    String writeData = "hello world";//要發(fā)送的字符串
    byte[] bytes = writeData.getBytes();//將字符串轉(zhuǎn)換為字節(jié)數(shù)組
    serialPort.writeBytes(bytes,bytes.length);//將字節(jié)數(shù)組全部寫入串口
    Thread.sleep(100);//休眠0.1秒,等待下位機(jī)返回?cái)?shù)據(jù)。如果不休眠直接讀取,有可能無法成功讀到數(shù)據(jù)
    String readData = "";
    while(port.bytesAvailable>0){//循環(huán)讀取所有的返回?cái)?shù)據(jù)。如果可讀取數(shù)據(jù)長度為0或-1,則停止讀取
        byte[] newData = new byte[port.bytesAvailable()];//創(chuàng)建一個(gè)字節(jié)數(shù)組,長度為可讀取的字節(jié)長度
        int numRead = port.readBytes(newData, newData.length);//將串口中可讀取的數(shù)據(jù)讀入字節(jié)數(shù)組,返回值為本次讀取到的字節(jié)長度
        String newDataString = new String(newData);//將新數(shù)據(jù)轉(zhuǎn)為字符串
        readData = readData + newDataString;//組合字符串
        Thread.sleep(20);//休眠0.02秒,等待下位機(jī)傳送數(shù)據(jù)到串口。如果不休眠,直接再次使用port.bytesAvailable()函數(shù)會(huì)因?yàn)橄挛粰C(jī)還沒有返回?cái)?shù)據(jù)而返回-1,并跳出循環(huán)導(dǎo)致數(shù)據(jù)沒讀完。休眠時(shí)間可以自行調(diào)試,時(shí)間越長,單次讀取到的數(shù)據(jù)越多。
    }
    System.out.println("readString:"+readData);
}

2.3 監(jiān)聽串口

可以對(duì)串口添加一個(gè)監(jiān)聽器來實(shí)時(shí)監(jiān)聽串口。監(jiān)聽器位于一個(gè)獨(dú)立的線程,使用時(shí)需要注意多線程通信的問題;

if(serialPort.isOpen){
    serialPort.addDataListener(new SerialPortDataListener() {//添加監(jiān)聽器。由于該監(jiān)聽器有兩個(gè)函數(shù),無法使用Lambda表達(dá)式

			@Override
			public int getListeningEvents() {
				// TODO Auto-generated method stub
				return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;//返回要監(jiān)聽的事件類型,以供回調(diào)函數(shù)使用??砂l(fā)回的事件包括:SerialPort.LISTENING_EVENT_DATA_AVAILABLE,SerialPort.LISTENING_EVENT_DATA_WRITTEN,SerialPort.LISTENING_EVENT_DATA_RECEIVED。分別對(duì)應(yīng)有數(shù)據(jù)在串口(不論是讀的還是寫的),有數(shù)據(jù)寫入串口,從串口讀取數(shù)據(jù)。如果AVAILABLE和RECEIVED同時(shí)被監(jiān)聽,優(yōu)先觸發(fā)RECEIVED
			}

			@Override
			public void serialEvent(SerialPortEvent event) {//事件處理函數(shù)
				// TODO Auto-generated method stub
				String data = "";
				if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE){
					return;//判斷事件的類型
                }
				while(port.bytesAvailable()!=0) {
					byte[] newData = new byte[port.bytesAvailable()];
					int numRead = port.readBytes(newData, newData.length);
					String newDataString = new String(newData);
					data = data + string;
					try {
						Thread.sleep(20);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}//同樣使用循環(huán)讀取法讀取所有數(shù)據(jù)
                //由于這里是監(jiān)聽函數(shù),所以也可以不使用循環(huán)讀取法,在監(jiān)聽器外創(chuàng)建一個(gè)全局變量,然后將每次讀取到的數(shù)據(jù)添加到全局變量里
			}
			
		})
}

到此這篇關(guān)于Java串口通信JSerialComm的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java串口通信JSerialComm內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring cloud 查詢返回廣告創(chuàng)意實(shí)例代碼

    Spring cloud 查詢返回廣告創(chuàng)意實(shí)例代碼

    在本篇文章里小編給大家整理的是關(guān)于Spring cloud 查詢返回廣告創(chuàng)意實(shí)例代碼,需要的朋友們可以跟著學(xué)習(xí)下。
    2019-08-08
  • 親測解決,nacos下線失敗問題

    親測解決,nacos下線失敗問題

    這篇文章主要介紹了親測解決,nacos下線失敗問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • MyBatisPlus代碼生成器實(shí)踐(自己二次封裝)

    MyBatisPlus代碼生成器實(shí)踐(自己二次封裝)

    這段描述主要講解了如何配置MybatisPlus以生成代碼,并強(qiáng)調(diào)了官方文檔的重要性,同時(shí)提到了.xml文件的放置位置以及自動(dòng)掃描的功能,適合對(duì)MybatisPlus感興趣的開發(fā)者閱讀
    2026-05-05
  • 淺談Timer和TimerTask與線程的關(guān)系

    淺談Timer和TimerTask與線程的關(guān)系

    下面小編就為大家?guī)硪黄獪\談Timer和TimerTask與線程的關(guān)系。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • springboot aop切到service層,不生效問題

    springboot aop切到service層,不生效問題

    這篇文章主要介紹了springboot aop切到service層,不生效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • maven profile自動(dòng)切換環(huán)境參數(shù)的2種方法詳解

    maven profile自動(dòng)切換環(huán)境參數(shù)的2種方法詳解

    這篇文章主要給大家介紹了關(guān)于maven profile自動(dòng)切換環(huán)境參數(shù)的2種方法,文中通過示例代碼將這兩種方法介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • SpringBoot版本升級(jí)容易遇到的一些問題

    SpringBoot版本升級(jí)容易遇到的一些問題

    由于項(xiàng)目需求,需要將nacos 1.4.6版本升級(jí)到2.x版本,由此引發(fā)的springboot、springcloud、springcloud Alibaba一系列版本變更,本文給大家總結(jié)一下SpringBoot版本升級(jí)容易遇到的一些問題,需要的朋友可以參考下
    2023-12-12
  • Java實(shí)現(xiàn)Jar文件的遍歷復(fù)制與文件追加

    Java實(shí)現(xiàn)Jar文件的遍歷復(fù)制與文件追加

    這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)Jar文件的遍歷復(fù)制與文件追加功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • java語言基礎(chǔ)之標(biāo)識(shí)符和命名規(guī)則詳解

    java語言基礎(chǔ)之標(biāo)識(shí)符和命名規(guī)則詳解

    這篇文章主要給大家介紹了關(guān)于java語言基礎(chǔ)之標(biāo)識(shí)符和命名規(guī)則的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • SpringBoot項(xiàng)目使用Liquibase數(shù)據(jù)庫版本管理方式

    SpringBoot項(xiàng)目使用Liquibase數(shù)據(jù)庫版本管理方式

    Liquibase是開源數(shù)據(jù)庫版本管理工具,支持多數(shù)據(jù)庫及多格式變更日志,實(shí)現(xiàn)變更追蹤、上下文執(zhí)行、文檔生成等功能,需配置目錄結(jié)構(gòu)及master.xml文件,注意@PostConstruct初始化順序問題,建議用CommandLineRunner替代
    2025-09-09

最新評(píng)論

阜南县| 朝阳市| 城市| 安泽县| 玛沁县| 衡阳市| 明溪县| 安岳县| 拜泉县| 纳雍县| 宁强县| 濮阳市| 通江县| 宣威市| 通化市| 醴陵市| 股票| 宜春市| 梅州市| 油尖旺区| 南雄市| 九龙坡区| 沁源县| 扬州市| 金乡县| 密云县| 精河县| 迁安市| 东兴市| 新巴尔虎右旗| 含山县| 英吉沙县| 山阴县| 治县。| 吴忠市| 石泉县| 抚松县| 巫山县| 札达县| 获嘉县| 长顺县|