Java串列埠接收資料顯示到label上
阿新 • • 發佈:2018-12-19
最近有個小任務,就是把下位機發送過來的資料實時顯示到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);//中斷事件監聽 } }