1. 程式人生 > >Java串列埠接收資料顯示到label上

Java串列埠接收資料顯示到label上

最近有個小任務,就是把下位機發送過來的資料實時顯示到label上,一直沒有頭緒,

後來看到了這篇博文,連結:

不如也開個執行緒,實時的取資料;

下面的是通過com口接收資料的程式碼,因為沒有用到傳送的部分,所以註釋掉了;

com3,波特率9600


 
import java.io.IOException;
import java.io.InputStream;
//import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.TooManyListenersException;
 
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;
 

public final class textRxTx {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//獲得系統埠列表
		getSystemPort();
		//開啟埠COM3,波特率9600
		final SerialPort serialPort = openSerialPort("COM3",9600);
		//啟動一個執行緒每2s向串列埠傳送資料,傳送1000次hello
	/*	new Thread(new Runnable() {
			@Override
			public void run() {
				int i = 1;
				while(i<1000) {
					String s = "hello";
					byte[] bytes = s.getBytes();
					textRxTx.sendData(serialPort, bytes);//傳送資料
					i++;
					try {
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}).start();*/
		//設定串列埠的listener
        textRxTx.setListenerToSerialPort(serialPort, new SerialPortEventListener() {
			@Override
			public void serialEvent(SerialPortEvent arg0) {
				if(arg0.getEventType() == SerialPortEvent.DATA_AVAILABLE) {//資料通知
					byte[] bytes = textRxTx.readData(serialPort);
					System.out.println("收到的資料長度:"+bytes.length);
					System.out.println("收到的資料:"+new String(bytes));
				}
			}
		});
//        closeSerialPort(serialPort);
	}
	
	/**
	 * 獲得系統可用的埠名稱列表
	 * @return 可用埠名稱列表
	 */
	@SuppressWarnings("unchecked")
	public static List<String> getSystemPort(){
		List<String> systemPorts = new ArrayList<>();
		//獲得系統可用的埠
		Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();
		while(portList.hasMoreElements()) {
			String portName = portList.nextElement().getName();//獲得埠的名字
			systemPorts.add(portName);
		}
		System.out.println("系統可用埠列表:"+systemPorts);
		return systemPorts;
	}
	
	/**
	 * 開啟串列埠
	 * @param serialPortName 串列埠名稱
	 * @param baudRate 波特率
	 * @return 串列埠物件
	 */
	public static SerialPort openSerialPort(String serialPortName,int baudRate) {
		try {
			//通過埠名稱得到埠
			CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(serialPortName);
			//開啟埠,(自定義名字,開啟超時時間)
			CommPort commPort = portIdentifier.open(serialPortName, 2222);
			//判斷是不是串列埠
            if (commPort instanceof SerialPort) {
                SerialPort serialPort = (SerialPort) commPort;
                //設定串列埠引數(波特率,資料位8,停止位1,校驗位無)
                serialPort.setSerialPortParams(baudRate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);                              
                System.out.println("開啟串列埠成功,串列埠名稱:"+serialPortName);
                return serialPort;
            }        
            else {
                //是其他型別的埠
                throw new NoSuchPortException();
            }
		} catch (NoSuchPortException e) {
			e.printStackTrace();
		} catch (PortInUseException e) {
			e.printStackTrace();
		} catch (UnsupportedCommOperationException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 關閉串列埠
	 * @param serialPort 要關閉的串列埠物件
	 */
	public static void closeSerialPort(SerialPort serialPort) {
		if(serialPort != null) {
			serialPort.close();
			System.out.println("關閉了串列埠:"+serialPort.getName());
			serialPort = null;
		}
	}
 
	/**
	 * 向串列埠傳送資料
	 * @param serialPort 串列埠物件 
	 * @param data 傳送的資料
	 *//*
	public static void sendData(SerialPort serialPort, byte[] data) {
		OutputStream os = null;
        try {
        	os = serialPort.getOutputStream();//獲得串列埠的輸出流
        	os.write(data);
        	os.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (os != null) {
                	os.close();
                	os = null;
                }                
            } catch (IOException e) {
            	e.printStackTrace();
            }
        }
	}*/
	
	/**
	 * 從串列埠讀取資料
	 * @param serialPort 要讀取的串列埠
	 * @return 讀取的資料
	 */
	public static byte[] readData(SerialPort serialPort) {
		InputStream is = null;
        byte[] bytes = null;
        try {
        	is = serialPort.getInputStream();//獲得串列埠的輸入流
            int bufflenth = is.available();//獲得資料長度
            while (bufflenth != 0) {                             
                bytes = new byte[bufflenth];//初始化byte陣列
                is.read(bytes);
                bufflenth = is.available();
            } 
        } catch (IOException e) {
        	e.printStackTrace();
        } finally {
            try {
                if (is != null) {
                	is.close();
                	is = null;
                }
            } catch(IOException e) {
            	e.printStackTrace();
            }
        }
        return bytes;
	}
	
	/**
	 * 給串列埠設定監聽
	 * @param serialPort
	 * @param listener
	 */
	public static void setListenerToSerialPort(SerialPort serialPort, SerialPortEventListener listener) {
		try {
			//給串列埠新增事件監聽
			serialPort.addEventListener(listener);
		} catch (TooManyListenersException e) {
			e.printStackTrace();
		}
		serialPort.notifyOnDataAvailable(true);//串列埠有資料監聽
		serialPort.notifyOnBreakInterrupt(true);//中斷事件監聽
	}
	
}