Java读写串口程序
好久没更新博客了,自从hacker-piao.cn域名过期以后(懒得续费)感觉PV明显下降,主要原因:百度对新域名piao2010.com的收录几乎为零,主要的访问来源谷哥中国的网络又偏偏时好时坏。。。牢骚结束步入正题:毕业设计的一部分涉及对串口读写操作,所以分享一下相关的东东。
首先是下载配置commapi(对串口操作必须用到的jar包)
将下载的文件解压缩后,在javacomm20-win32commapi目录下有必需的三个文件comm.jar,javax.comm. properties和win32comm.dll。将文件comm.jar拷贝到%JAVA_HOME%jrelibext;文件 javax.comm. properties拷贝%JAVA_HOME%jrelib; 文件win32comm.dll拷贝到%JAVA_HOME%bin。注意%JAVA_HOME%是jdk的路径,而非jre。
有两种实现方式:
一是监听方式
package com; import java.io.*; import java.util.*; import javax.comm.*; public class SimpleRead implements Runnable, SerialPortEventListener { static CommPortIdentifier portId; static Enumeration portList; InputStream inputStream; OutputStream outputStream; SerialPort serialPort; Thread readThread; public static void main(String[] args) { portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType()==CommPortIdentifier.PORT_SERIAL) { if (portId.getName().equals( "COM4")) { SimpleRead reader = new SimpleRead(); } } } } public SimpleRead() { try {//打开串口COM1 serialPort = (SerialPort) portId.open( "SimpleReadApp ", 2000); } catch (PortInUseException e) {} try {//获得输入输出流 inputStream = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); } catch (IOException e) {} try {//为串口添加监听器 serialPort.addEventListener(this); } catch (TooManyListenersException e) {} serialPort.notifyOnDataAvailable(true); try {//配置串口 serialPort.setSerialPortParams(9600,//波特率9600bps SerialPort.DATABITS_7,//7位数据位 SerialPort.STOPBITS_1,//1位停止位 SerialPort.PARITY_EVEN);//偶校验 } catch (UnsupportedCommOperationException e) {} readThread = new Thread(this);//新建一线程 readThread.start();//启动线程 } public void run() { try { Thread.sleep(1); } catch (InterruptedException e) {} } public void serialEvent(SerialPortEvent event) { 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://如果有数据到达 byte[] readBuffer = new byte[200]; try { while (inputStream.available() > 0) { //读取一个字节到readBuffer int numBytes = inputStream.read(readBuffer); } System.out.print(new String(readBuffer)); } catch (IOException e) {} break; } } } |
另一种是直接读取的方式:
package com; import java.io.*; import java.text.SimpleDateFormat; import java.util.Date; import javax.comm.*; import javax.sql.rowset.serial.SerialException; public class Read { public static void main(String[] args) { CommPortIdentifier portId = null; try { portId = CommPortIdentifier.getPortIdentifier("COM4"); } catch (NoSuchPortException e1) { System.out.println("串口不存在!"); e1.printStackTrace(); } try { SerialPort sPort = (SerialPort) portId.open("串口读取程序", 60); try { sPort.setSerialPortParams(9600,SerialPort.DATABITS_7, SerialPort.STOPBITS_1,SerialPort.PARITY_EVEN); } //波特率9600bps,7位数据位,1停止位 ,偶校验 catch (UnsupportedCommOperationException e) {} //用于对串口写数据 //用于从串口读数据 InputStream is = null; try { is = new BufferedInputStream(sPort.getInputStream()); } catch (IOException e) { System.out.println("读取串口失败!"); e.printStackTrace(); } int PacketLength = 40;// PacketLength为缓冲数组长度 int newData; while (true) { char[] msgPack = new char[PacketLength]; for(int i = 0; i < PacketLength; i++){ try { if( (newData = is.read()) != -1){ if ( newData == 10 ) break; msgPack[i] = (char)newData; System.out.println(msgPack[i]); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } String string = String.valueOf(msgPack).trim(); String[] dataArray = string.split(","); for(int i=0;i<dataArray.length;i++) { System.out.print(i+":"+dataArray[i]+"n"); } } }catch (PortInUseException e) { try { throw new SerialException(e.getMessage()); } catch (SerialException e1) { System.out.println("串口被占用!"); e1.printStackTrace(); } } } } |
总结:如果数据传输速度比较快的话建议采用第二种方式。
百度对于新网站的冷藏期一般都要2个月
[回复]
飘(piao2010) 回复:
6月 3rd, 2010 at 16:17
问题是我的新域名已经启用4个多月了。。。实在受不了百度。
[回复]
http://dzh2.mop.com/?url=http://www.piao2010.com
这个是怎么回事?在网上看到说是xss漏洞~~但是没解释~~
[回复]
飘(piao2010) 回复:
6月 3rd, 2010 at 16:53
就是利用mop这个遗漏可以实现嵌入其他网页,比如说网络钓鱼或者挂马等等。
[回复]
0815 回复:
6月 3rd, 2010 at 16:55
能干坏事是知道,就是那人没有写任何的过程,所以很好奇怎么回事,哈哈
[回复]
飘(piao2010) 回复:
6月 3rd, 2010 at 17:00
危害还是比较大的,毕竟是名站。
0815 回复:
6月 3rd, 2010 at 17:19
我记得你的博客里面有一篇讲伪造ip的文章,找不到了~~~
[回复]
飘(piao2010) 回复:
6月 3rd, 2010 at 22:11
搜索“伪造”