Java接收串口数据
2015-07-09 17:25
567 查看
参考《ava接收串口数据》,开源中国社区
自己的使用经验:
1.ReadPort()虽然可以提供外部java读取数据,但最好添加一个延时,否则很容易出现读取若干次后程序没有响应,但又不报错的问题。
2.此程序中serialPort.addEventListener(this);有可能会产生触发不了数据接收程序。所以最好在本地建立本程序的实例,然后加载该实例就可以读取到数据了。
3.信息的标志位这个还是自定义一下比较好。
自己的使用经验:
1.ReadPort()虽然可以提供外部java读取数据,但最好添加一个延时,否则很容易出现读取若干次后程序没有响应,但又不报错的问题。
2.此程序中serialPort.addEventListener(this);有可能会产生触发不了数据接收程序。所以最好在本地建立本程序的实例,然后加载该实例就可以读取到数据了。
SerialBean serialBean = new SerialBean(); serialPort.addEventListener(serialBean);
3.信息的标志位这个还是自定义一下比较好。
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); ce3c } catch(IOException e) { } break; } } public void run() { try { Thread.sleep(2000); } catch(InterruptedException e) { } } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- 我是运营,我没有假期