搜尋
首頁Javajava教程簡單介紹Java的串口通信

有關Java串口通訊簡介,嵌入式系統或感測器網路的許多應用和測試都需要透過PC機與嵌入式設備或感測器節點進行通訊。其中,最常用的介面就是RS-232串列埠和並口(鑑於USB介面的複雜性以及不需要很大的資料傳輸量,USB介面用在這裡還是顯得過於奢侈,況且目前除了SUN有一個支援USB的包之外,我還沒有看到其他直接支援USB的Java類別庫)。

SUN的CommAPI分別提供了對常用的RS232序列埠和IEEE1284並行埠通訊的支援。 RS-232-C(又稱EIA RS-232-C,以下簡稱RS232)是在1970年由美國電子工業協會(EIA)聯合貝爾系統、調變解調器廠商及電腦終端生產廠商共同製定的用於串列通訊的標準。 RS232是一個全雙工的通訊協議,它可以同時進行資料接收和發送的工作。

1 常見的Java串口包

目前,常見的Java串口包有SUN在1998年發布的串口通訊API:comm2.0.jar(Windows下)、comm3.0.jar(Linux/Solaris);IBM的串口通訊API以及一個開源的實作。鑑於在Windows下SUN的API比較常用以及IBM的實現和SUN的在API層面都是一樣的,那個開源的實現又不像兩家大廠的產品那樣讓人放心,這裡就只介紹SUN的串口通信API在Windows平台下的使用。

按照其使用說明(Readme.html)的說法,要想使用串口包進行串口通信,除了設置好環境變量之外,還要將win32com.dll複製到bin目錄下;將comm.jar複製到lib ;把javax.comm.properties也同樣拷貝到lib 目錄下。然而在真正運行使用串口包的時候,僅作這些是不夠的。

因為通常運行「java MyApp」的時候,是由JRE下的虛擬機器啟動MyApp的。而我們只複製上述檔案到JDK對應目錄下,所以應用程式將會提示找不到串列埠。解決這個問題的方法很簡單,我們只要將上面提到的檔案放到JRE對應的目錄下就可以了。

值得注意的是,在網路應用程式中使用串口API的時候,還會遇到其他更複雜問題。有興趣的話,可以查看CSDN社群中「關於網頁上Applet用javacomm20讀取客戶端串口的問題」的貼文。

2 串列口API概覽

2.1 javax.comm.CommPort

這是用來描述一個被底層系統支援的連接埠的抽象類別。它包含一些高層的IO控制方法,這些方法對於所有不同的通訊連接埠來說是通用的。 SerialPort 和ParallelPort都是它的子類,前者用來控制串列埠而後者用來控這並口,二者對於各自底層的實體埠都有不同的控制方法。這裡我們只關心 SerialPort。

2.2 javax.comm.CommPortIdentifier

這個類別主要用於對串列埠進行管理和設置,是對串口進行存取控制的核​​心類別。主要包括以下方法

確定是否有可用的通訊埠

為IO操作開啟通訊埠

決定埠的所有權

處理埠所有權的爭用

管理埠所有權變更引發的事件(Event)

2.3

2.3 javax.comm.SerialPort

這個類別用來描述一個RS-232串列通訊埠的底層接口,它定義了串口通訊所需的最小功能集。透過它,使用者可以直接對串口進行讀取、寫入及設定工作。

2.4 串口API實例

大段的文字怎麼也不如一個小例子來的清晰,下面我們就一起看一下串口包自帶的例子---SerialDemo中的一小段程式碼來加深對串口API核心類的使用方法的認識。

2.4.1 列舉出本機所有可用串列埠

void listPortChoices() {  
CommPortIdentifier portId;  
Enumeration en = CommPortIdentifier.getPortIdentifiers();  
// iterate through the ports.  
while (en.hasMoreElements()) {  
portId = (CommPortIdentifier) en.nextElement();  
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {  
System.out.println(portId.getName());  
}  
}  
portChoice.select(parameters.getPortName());  
}

以上程式碼可以列舉出目前系統所有可用的串列埠名稱,我的機器上輸出的結果是COM1和COM3。

2.4.2 串列埠參數的配置

串口一般有以下參數可以在該串列埠開啟先前配置進行配置:包括波特率,輸入/輸出流控制,資料位數,停止位和齊偶校驗。

SerialPort sPort;  
try {  
sPort.setSerialPortParams(BaudRate,Databits,Stopbits,Parity);  
//设置输入/输出控制流  
sPort.setFlowControlMode(FlowControlIn | FlowControlOut);  
} catch (UnsupportedCommOperationException e) {}

2.4.3 串口的讀寫

對串口讀寫之前需要先打開一個串口:

CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(PortName);  
try {  
SerialPort sPort = (SerialPort) portId.open("串口所有者名称", 超时等待时间);  
} catch (PortInUseException e) {//如果端口被占用就抛出这个异常  
throw new SerialConnectionException(e.getMessage());  
}  
//用于对串口写数据  
OutputStream os = new BufferedOutputStream(sPort.getOutputStream());  
os.write(int data);  
//用于从串口读数据  
InputStream is = new BufferedInputStream(sPort.getInputStream());  
int receivedData = is.read();

讀出來的是int型,你可以把它轉換成需要的其他類型。

這裡要注意的是,由於Java語言沒有無符號類型,即所有的類型都是帶符號的,在由byte到int的時候應該尤其註意。因為如果byte的最高位是1,則轉成int型別時會用1來佔位。這樣,原本是10000000的byte類型的數變成int型就成了1111111110000000,這是很嚴重的問題,應該要注意避免。

3 串口通信的通用模式及其問題🎜🎜終於嘮叨完我最討厭的基礎知識了,下面開始我們本次的重點--串口應用的研究。由於向串列埠寫資料很簡單,所以這裡我們只關注從串列口讀取資料的情況。 🎜

通常,串口通訊應用程式有兩種模式,一種是實現SerialPortEventListener接口,監聽各種串口事件並作相應處理;另一種就是建立一個獨立的接收線程專門負責資料的接收。由於這兩種方法在某些情況下存在著很嚴重的問題(至於什麼問題這裡先賣個關子J),所以我的實作是採用第三種方法來解決這個問題。


更多簡單介紹Java的串口通訊相關文章請關注PHP中文網!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

如何在Java中實施功能編程技術?如何在Java中實施功能編程技術?Mar 11, 2025 pm 05:51 PM

本文使用lambda表達式,流API,方法參考和可選探索將功能編程集成到Java中。 它突出顯示了通過簡潔性和不變性改善代碼可讀性和可維護性等好處

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何將Java的Nio(新輸入/輸出)API用於非阻滯I/O?如何將Java的Nio(新輸入/輸出)API用於非阻滯I/O?Mar 11, 2025 pm 05:51 PM

本文使用選擇器和頻道使用單個線程有效地處理多個連接的Java的NIO API,用於非阻滯I/O。 它詳細介紹了過程,好處(可伸縮性,性能)和潛在的陷阱(複雜性,

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

如何使用Java的插座API進行網絡通信?如何使用Java的插座API進行網絡通信?Mar 11, 2025 pm 05:53 PM

本文詳細介紹了用於網絡通信的Java的套接字API,涵蓋了客戶服務器設置,數據處理和關鍵考慮因素,例如資源管理,錯誤處理和安全性。 它還探索了性能優化技術,我

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器