Java接收串口数据,java接收串口,Java使用javax.
分享于 点击 484 次 点评:38
Java接收串口数据,java接收串口,Java使用javax.
Java使用javax.comm库接收串口数据,使用单独的线程,实时处理接收数据
[Java]代码
import java.io.*;import java.util.*;import javax.comm.*;public class SerialBean implements Runnable,SerialPortEventListener{ String PortName; int baud; CommPortIdentifier portId; SerialPort serialPort; static OutputStream out; static InputStream in; String Buf=null;// 缓存一条最新信息 boolean hasData=false;// 标志有无新数据 StringBuilder buf=new StringBuilder(128); Thread readThread; public SerialBean(int PortID,int baud) { PortName="COM"+PortID; this.baud=baud; } public int Initialize() { int InitSuccess=1; int InitFail=-1; try { portId=CommPortIdentifier.getPortIdentifier(PortName); try { serialPort=(SerialPort)portId.open("Serial_Communication",2000); serialPort.setSerialPortParams(this.baud,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE); serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true); } catch(PortInUseException e) { return InitFail; } catch(TooManyListenersException e) { return InitFail; } catch(UnsupportedCommOperationException e) { return InitFail; } try { in=serialPort.getInputStream(); out=serialPort.getOutputStream(); } catch(IOException e) { return InitFail; } } catch(NoSuchPortException e) { return InitFail; } readThread=new Thread(this); readThread.start(); return InitSuccess; } public boolean hasData() { return hasData; } public String ReadPort() { if(hasData) { this.hasData=false; return this.Buf; } else return null; } @SuppressWarnings("deprecation") public void ClosePort() { if(readThread!=null ) readThread.stop(); if(serialPort!=null) serialPort.close(); } @Override public void serialEvent(SerialPortEvent event) { /** * 事件类型: * * BI -通讯中断. CD -载波检测. CTS -清除发送. DATA_AVAILABLE -有数据到达. * DSR-数据设备准备好. FE -帧错误. OE -溢位错误. OUTPUT_BUFFER_EMPTY * -输出缓冲区已清空. PE -奇偶校验错. RI - 振铃指示. */ switch(event.getEventType()) { case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break; case SerialPortEvent.DATA_AVAILABLE: try { char b; while(in.available()>0) { b=(char)in.read(); buf.append(b); } int beg=0,end=0; for(int i=0;;i++) { if(buf.length()<2) { return; } if(buf.charAt(0)=='\r'&&buf.charAt(1)=='\n')// 以回车换行开头 { beg=2; } else // 不以换行开头 { beg=0; } end=buf.indexOf("\r\n",beg); if(end==-1)// 未接受完一整条信息 break; Buf=buf.substring(beg,end);// 截取数据 buf.delete(0,end+2);// 删除已用数据 System.out.printf("--%s--\n",Buf); this.hasData=true; } // System.out.println(con); } catch(IOException e) { } break; } } public void run() { try { Thread.sleep(2000); } catch(InterruptedException e) { } }}
用户点评