Win7环境下Java串口数据读写(RXTX)(转载)

来源:互联网 发布:有粤语听书软件 编辑:程序博客网 时间:2024/05/02 23:31

转载自:

http://blog.sina.com.cn/s/blog_5ceb51480100rdgw.html


   最近在实际项目中,需要Java语言来实现对串口数据的读写操作。本来可以用javax.comm这个包的,但是经过几次测试,始终不能读出PC上的串口;于是我换了rxtx包在Myeclipse8.6下进行测试,测试结果表明可以获取到PC的可用端口。javax.comm在windows下的开发维护已经停止了,rxtx的旧版本支持在javax.comm-win32-2.0基础上的扩展,rxtx新版本支持对javax.comm的覆盖式支持,也就是说原来用javax.comm的把所有import javax.comm.*改成import gnu.io.*就可以正常使用了,其他只须相关的dll文件,不用properties文件,支持的端口类型也明显多了很多。

    RXTX包下载地址:http://rxtx.qbang.org/pub/rxtx/rxtx-2.1-7-bins-r2.zip
    下载解压后,其配置环境如下:

    把下载包中rxtx-2.1-7-bins-r2\Windows\i368-mingw32\rxtxSerial.dll 放到你%java_home%\jre\bin下面(%java_home%\jre\bin\rxtxSerial.dll)和C:\Windows\System32下面(C:\Windows\System32\rxtxSerial.dll);

    把下载包中rxtx-2.1-7-bins-r2\RXTXcomm.jar放到%java_home%\jre\lib\ext下面(%java_home%\jre\lib\ext\RXTXcomm.jar)。

注:%java_home%为你安装JDK的路径,如:C:\Program Files\Java\jdk1.6.0_10

    下面是在Myeclipse中引用RXTXcomm.jar,选择工程Build Path,选择Configure Build Path,选择Libraries,点击Add Exteral JARS按钮,在弹出的对话框中找到RXTXcomm.jar,然后选中,点击打开,再点击OK即可。

    好了,下面就可以进行程序的编写了,首先看看能都获取到你PC上的串口,程序如下:

package test;
import java.util.Enumeration;
import gnu.io.*;

public class TestSerial {
 @SuppressWarnings("unchecked")
 static Enumeration portList; 
 static CommPortIdentifier portId;

 

 public static void main(String[] args) {
  try {
      portList = CommPortIdentifier.getPortIdentifiers(); //得到当前连接上的端口
      while (portList.hasMoreElements()) {
       portId = (CommPortIdentifier) portList.nextElement();
       if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {//判断如果端口类型是串口
        //if (portId.getName().equals("COM3")) { //判断如果COM3端口已经启动就连接
         System.out.println(portId.getName());
        }
       }
      //}
     } catch (Exception e) {
      e.printStackTrace();
     }  
  
}

测试结果:

Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7

COM1
COM3

 

下面程序是作为服务端,当收到WIFI发送的数据,然后对串口进行写数据操作的程序:

package test;
import java.io.*;
import java.net.*;
import gnu.io.*;

import java.util.*;
public class Tcpserver implements Runnable {
 
 public static final String ServerIP="192.168.1.108";
 public static final int ServerPort=7788;
 static CommPortIdentifier portId; //串口通信管理类
 @SuppressWarnings("unchecked")
 static Enumeration portList;   //已经连接上的端口的枚举
 public static SerialPort serialPort;     //串口的引用

 

 

本文参考:http://dev.firnow.com/course/3_program/java/javajs/20100112/189411.html

 


 public static OutputStream out;

 public void run(){
  try{
   System.out.println("Connection...");
   ServerSocket serverSocket = new ServerSocket(ServerPort);
   while(true){
    Socket client=serverSocket.accept();
    System.out.println("Receiveing...");
    try{
     BufferedReader bf=new BufferedReader(new InputStreamReader(client.getInputStream()));
     String str=bf.readLine();
     if(str.equals("0")){
      out.write(48);
      out.flush();
     }else if(str.equals("1")){
      out.write(49);
      out.flush();
     }
     System.out.println("Received:'"+str+"'");
     
    }catch(Exception e)
    {
     e.toString();
    }finally{
     out.close();
     client.close();
     System.out.println("done");
    }
   }
  }catch(Exception e)
  {
   e.toString();
  }
 }

 
 public static  void main(String[] args) {
  
  Thread ServerThread=new Thread( new Tcpserver());
  ServerThread.start();
  try {
      portList = CommPortIdentifier.getPortIdentifiers(); //得到当前连接上的端口
      while (portList.hasMoreElements()) {
       portId = (CommPortIdentifier) portList.nextElement();
       if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {//判断如果端口类型是串口
        if (portId.getName().equals("COM1")) { //判断如果COM3端口已经启动就连接
        
         serialPort=(SerialPort)portId.open("COM1",2000); 
         serialPort.setSerialPortParams(38400, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
         out=serialPort.getOutputStream();
         System.out.println(portId.getName());
        }
       }
      }
     } catch (Exception e) {
      e.printStackTrace();
     }
  // TODO Auto-generated method stub
 }

}


原创粉丝点击