轉載自:
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
}
}