1. 程式人生 > 其它 >java串列埠通訊

java串列埠通訊

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========
請輸入你的串列埠: