java串列埠通訊
阿新 • • 發佈:2021-09-04
java串列埠通訊,由於沒有相應的串列埠硬體,選了一款windows串列埠虛擬機器機器
1. 準備
串列埠模擬器
Launch Virtual Serial Port Driver 下載地址
模擬兩對四個串列埠,COM1傳送資料給COM2,COM3傳送資料給COM4
java包
<dependency> <groupId>com.fazecast</groupId> <artifactId>jSerialComm</artifactId> <version>[2.0.0,3.0.0)</version> </dependency>
2. java原始碼
mport com.fazecast.jSerialComm.SerialPort; import com.fazecast.jSerialComm.SerialPortDataListener; import com.fazecast.jSerialComm.SerialPortEvent; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @Classname ComTest * @Description com串列埠通訊 * @Date 2021/9/4 10:44 * @Created by huangsm */ public class ComTest { /** * <com名稱,SerialPort>串列埠通訊map,儲存串列埠名稱與串列埠資訊 */ private Map<String, SerialPort> comMap = new HashMap<>(); /** * com口列表 */ private List<String> comList = new ArrayList<>(); public ComTest() { //將所有的串列埠資訊放入comlist,comMap中 SerialPort[] commPorts = SerialPort.getCommPorts(); for (SerialPort commPort : commPorts) { comList.add(commPort.getSystemPortName()); comMap.put(commPort.getSystemPortName(), commPort); //監聽所有串列埠通訊的資料 commPort.openPort(); commPort.addDataListener(new SerialPortDataListener() { @Override public int getListeningEvents() { return SerialPort.LISTENING_EVENT_DATA_RECEIVED; } @Override public void serialEvent(SerialPortEvent serialPortEvent) { byte[] newData = serialPortEvent.getReceivedData(); System.err.println(String.format("串列埠%s接收到資料大小:%s,串列埠資料內容:%s" ,serialPortEvent.getSerialPort().getSystemPortName(),newData.length,new String(newData))); } }); } } public static void main(String[] args) throws Exception { ComTest comTest = new ComTest(); List<String> comList = comTest.comList; Map<String, SerialPort> comMap = comTest.comMap; BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in)); while (true) { System.out.println("你的可以通訊的串列埠列表"); for (String comName : comList) { System.out.println("========" + comName + "========"); } System.out.println("請輸入你的串列埠:"); String com = systemIn.readLine(); if(!comList.contains(com)){ System.out.println("輸入的串列埠不正確:"); continue; } System.out.println("輸入你要傳送的訊息:"); String msg = systemIn.readLine(); SerialPort serialPort = comMap.get(com); serialPort.writeBytes(msg.getBytes(),msg.getBytes().length); //這裡是讓串列埠先接收到資料再重新發送資料 Thread.sleep(1000); } } }
3. 執行結果
你的可以通訊的串列埠列表
========COM1========
========COM2========
========COM3========
========COM4========
請輸入你的串列埠:
COM3
輸入你要傳送的訊息:
137912037
串列埠COM4接收到資料大小:9,串列埠資料內容:137912037
你的可以通訊的串列埠列表
========COM1========
========COM2========
========COM3========
========COM4========
請輸入你的串列埠: