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();
 
           	 }
 
       	}
 
}
 
}

总结:如果数据传输速度比较快的话建议采用第二种方式。

相关日志

  1. Firm 说:

    百度对于新网站的冷藏期一般都要2个月

    [回复]

    飘(piao2010) 回复:

    问题是我的新域名已经启用4个多月了。。。实在受不了百度。

    [回复]

  2. 0815 说:

    http://dzh2.mop.com/?url=http://www.piao2010.com

    这个是怎么回事?在网上看到说是xss漏洞~~但是没解释~~

    [回复]

    飘(piao2010) 回复:

    就是利用mop这个遗漏可以实现嵌入其他网页,比如说网络钓鱼或者挂马等等。

    [回复]

    0815 回复:

    能干坏事是知道,就是那人没有写任何的过程,所以很好奇怎么回事,哈哈

    [回复]

    飘(piao2010) 回复:

    危害还是比较大的,毕竟是名站。

    0815 回复:

    我记得你的博客里面有一篇讲伪造ip的文章,找不到了~~~

    [回复]

    飘(piao2010) 回复:

    搜索“伪造”

  1. There are no trackbacks for this post yet.

Leave a Reply