java 串口通信詳細(xì)及簡單實(shí)例
java 實(shí)現(xiàn)串口通信
最近做了一個與硬件相關(guān)的項目,剛開始聽說用java和硬件打交道,著實(shí)下了一大跳。java也可以操作硬件?
后來接觸到是用java通過串口通信控制硬件感覺使用起來還不錯,也很方便。
特拿出來和大家一起分享一下。
準(zhǔn)備工作:
首先到SUN官網(wǎng)下載一個zip包:javacomm20-win32.zip
其中重要的有這幾個文件:
win32com.dll
comm.jar
javax.comm.properties
按照說明配置好環(huán)境,如下:
將win32com.dll復(fù)制到<JDK>\bin目錄下;將comm.jar復(fù)制到<JDK>\lib;把 javax.comm.properties也同樣拷貝到<JDK>\lib目錄下。然而在真正運(yùn)行使用串口包的時候,僅作這些是不夠的。因 為通常當(dāng)運(yùn)行“java MyApp”的時候,是由JRE下的虛擬機(jī)啟動MyApp的。而我們只復(fù)制上述文件到JDK相應(yīng)目錄下,所以應(yīng)用程序?qū)崾菊也坏酱?。解決這個問題的 方法很簡單,我們只須將上面提到的文件放到JRE相應(yīng)的目錄下就可以了
到這一個可以java 串口開發(fā)環(huán)境就搭建完成了
確認(rèn)本機(jī)可以使用的串口:
package test;
import java.util.Enumeration;
import java.util.HashMap;
import javax.comm.CommPortIdentifier;
import javax.comm.SerialPort;
public class GetSerialPorts {
public 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());
}
}
}
public static void main(String[] args) {
GetSerialPorts GSP = new GetSerialPorts();
GSP.listPortChoices();
}
}
打開串口,關(guān)閉串口:
package test;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.HashMap;
import javax.comm.CommPortIdentifier;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.UnsupportedCommOperationException;
public class GetSerialPorts {
private CommPortIdentifier portId;
private SerialPort testPort;
private CommPortIdentifier myPort;
private InputStream is;
private OutputStream os;
public void listPortChoices() {
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());
}
myPort = portId;// 任意取一個串口,比如com1
}
}
public boolean openPort() {
try {
testPort = (SerialPort) myPort.open("COM1", 500);// 注意這里必須換成一個真實(shí)的串口
try {
this.testPort.setSerialPortParams(38400, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN);
} catch (UnsupportedCommOperationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
this.testPort.enableReceiveTimeout(30);
} catch (UnsupportedCommOperationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.testPort.setOutputBufferSize(1024);
this.testPort.setInputBufferSize(1024);
try {
this.is = this.testPort.getInputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
this.os = this.testPort.getOutputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.testPort.notifyOnDataAvailable(true);
this.testPort.notifyOnOutputEmpty(true);
this.testPort.notifyOnBreakInterrupt(true);
// this.printerPort.addEventListener(new PrintPortListener(is));
System.out.println("打開com1機(jī)串口成功");
return true;
} catch (PortInUseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}
/**
* TODO 關(guān)閉端口
*
* @param
* @return Map
* @throws
*/
public boolean closePort() {
// TODO Auto-generated method stub
try {
if (null != this.testPort) {
is.close();
os.close();
this.testPort.close();
}
System.out.println("關(guān)閉COM1串口成功");
return true;
} catch (Exception e) {
// TODO Auto-generated catch block
// e.printStackTrace();
System.out.println("關(guān)閉COM1串口失敗");
return false;
}
}
public static void main(String[] args) {
GetSerialPorts GSP = new GetSerialPorts();
GSP.listPortChoices();
GSP.openPort();
}
}
讀數(shù)據(jù):
/**
* TODO 接收端口數(shù)據(jù)
*
* @param InputStream
* @return String
* @throws
*/
public String readData(InputStream is) {
// 讀取緩沖區(qū)域
byte[] readBuffer = new byte[4096];
int readDataLength = 0;
try {
readDataLength = is.read(readBuffer);
// for (byte b : readBuffer) {
// System.out.print(b);
// }
// System.out.println();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
// 將真實(shí)數(shù)據(jù)保存到零時數(shù)組中
byte[] readTemp = new byte[readDataLength];
for (int i = 0; i < readDataLength; i++) {
readTemp[i] = readBuffer[i];
}
// 將byte數(shù)組轉(zhuǎn)換為16進(jìn)制字符串
String stringTemp = FeelTheBase.bytesToHexString(readTemp);
// System.out.println("指令返回值" + stringTemp);
return stringTemp;
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
解決Mybatis-Plus更新方法不更新NULL字段的問題
這篇文章主要介紹了解決Mybatis-Plus更新方法不更新NULL字段的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
mybatis plus條件構(gòu)造器queryWrapper、updateWrapper
這篇文章主要介紹了mybatis plus條件構(gòu)造器queryWrapper、updateWrapper,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
詳解Spring Security中的HttpBasic登錄驗(yàn)證模式
HttpBasic登錄驗(yàn)證模式是Spring Security實(shí)現(xiàn)登錄驗(yàn)證最簡單的一種方式,也可以說是最簡陋的一種方式,這篇文章主要介紹了Spring Security的HttpBasic登錄驗(yàn)證模式,需要的朋友可以參考下2019-11-11
Java調(diào)取創(chuàng)藍(lán)253短信驗(yàn)證碼的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java調(diào)取創(chuàng)藍(lán)253短信驗(yàn)證碼的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-04-04
mybatis連接mysql的實(shí)現(xiàn)過程
通過配置Maven的pom文件,可以簡化MyBatis連接數(shù)據(jù)庫的過程,免去手動下載和導(dǎo)入各種依賴包的麻煩,本文介紹了如何利用Maven導(dǎo)入MyBatis及其他相關(guān)依賴,如Junit、MySQL連接驅(qū)動、Druid連接池和Dbutil等,以簡化數(shù)據(jù)庫操作和測試2024-10-10
SpringBoot配置Spring?Security的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot配置Spring?Security的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10
SpringCloud基本Rest微服務(wù)工程搭建過程
這篇文章主要介紹了SpringCloud基本Rest微服務(wù)工程搭建,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01

