本篇主要講述使用Java對串口進行讀取和發送操作
準備
在項目中導入第三方Jar包
Jar包已經在資源中綁定,或者去官網上自行下載jSerialComm
注意當前jar包是配合JDK1.8環境使用,如果是1.8以下程序將直接中斷
安裝虛擬串口的軟件
Configure Virtual Serial Port Driver:可以在沒有物理意義上的設備時,虛擬出來兩個串口,免費使用14天
sscom5.13.1可以通過端口進行發送數據和接收數據的軟件
設置發送端,端口使用COM2
同樣的設置第二個頁面接收頁面,接收端設置為COM1
端口連接是否正常
測試通過
測試通過以后再進行代碼的編寫,不然不利于排除錯誤。
Java代碼讀取串口數據
- Java代碼接收串口傳輸的數據
package dzz.com;
import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent; public class SerialPortReaderData { private SerialPort serialPort; public void openAndReadSerialPort(String portName) { // 查找并打開串口 serialPort = SerialPort.getCommPort(portName); if (serialPort.openPort()) { System.out.println("Port is open: " + portName); // 設置串口參數(這些參數應該與你的設備相匹配) serialPort.setBaudRate(9600); serialPort.setNumDataBits(8); serialPort.setNumStopBits(SerialPort.ONE_STOP_BIT);serialPort.setParity(SerialPort.ODD_PARITY);try {//休眠,因為防止過度的循環Thread.sleep(1000L);} catch (InterruptedException e) {closeSerialPort();}boolean flag=false;StringBuffer sb= new StringBuffer();while(serialPort.isOpen()) {//獲取傳輸過來的數據長度int bytesAvailable = serialPort.bytesAvailable();
// System.out.println(bytesAvailable);//判斷端口是否傳輸數據if(bytesAvailable!=-1&&bytesAvailable!=0) {byte[] newData = new byte[bytesAvailable]; //讀取端口數據 int numRead = serialPort.readBytes(newData, newData.length); //解析成字符串并拼接sb.append(new String(newData, 0, numRead));flag=true;}//讀取完成跳出循環if(flag&&(bytesAvailable==-1||bytesAvailable==0)) {break;}}System.out.println(sb.toString());closeSerialPort();}} //關閉端口釋放資源private void closeSerialPort() { //判斷是否已經關閉了端口if (serialPort != null && serialPort.isOpen()) { //移除端口的監聽serialPort.removeDataListener(); //關閉端口serialPort.closePort(); System.out.println("Port closed."); } } public static void main(String[] args) { SerialPortReaderData reader = new SerialPortReaderData(); reader.openAndReadSerialPort("COM1"); // 替換為你的串口名 // 可以在這里添加其他邏輯,比如等待用戶輸入來退出程序等 // 注意:在實際應用中,你可能需要有一種機制來確保程序不會無限期地運行下去 // 例如,你可以設置一個超時時間或等待用戶輸入來關閉程序 }
}
- Java通過端口發送數據
package dzz.com;
import com.fazecast.jSerialComm.SerialPort; public class SerialSender { public static void main(String[] args) { // 列出所有可用的串口 SerialPort[] comPorts = SerialPort.getCommPorts(); for (SerialPort port : comPorts) { System.out.println("Found port: " + port.getSystemPortName()); } // 選擇一個串口(這里假設我們選擇第一個串口) SerialPort comPort = SerialPort.getCommPort("COM1"); // 打開串口 if (comPort.openPort()) { System.out.println("Port is open: " + comPort.getSystemPortName()); // 設置串口參數(這些參數應該與你的設備相匹配) comPort.setBaudRate(9600); comPort.setNumDataBits(8); comPort.setNumStopBits(SerialPort.ONE_STOP_BIT);comPort.setParity(SerialPort.ODD_PARITY);// 發送數據 String dataToSend = "Hello, Serial Port!"; byte[] data = dataToSend.getBytes(); int numWritten = comPort.writeBytes(data, data.length); System.out.println("Wrote " + numWritten + " bytes."); // 關閉串口 comPort.closePort(); } else { System.out.println("Unable to open " + comPort.getSystemPortName()); } }
}
- 讀配置文件的形式動態設置端口值
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; public class ConfigReader { //路徑private static final String CONFIG_FILE = "app.properties"; public static void main(String[] args) { Properties properties = new Properties(); InputStream input = null; try { input = new FileInputStream(CONFIG_FILE); // 從輸入流加載屬性列表 properties.load(input); // 讀取屬性值 String name = properties.getProperty("port.name"); String baudrate = properties.getProperty("port.baudrate"); String numdataits = properties.getProperty("port.numdataits"); String stopbits = properties.getProperty("port.stopbits"); String parity = properties.getProperty("port.parity"); // 打印屬性值 System.out.println("name" + name); } catch (IOException ex) { ex.printStackTrace(); } finally { if (input != null) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } } }
}
配置文件以properties為后綴名
port.name=COM1
port.baudrate=9600
port.numdataits=8
port.stopbits=1
port.parity=1