不再需要 javacomm!
众所周知,windows下使用java进行串口通讯需要用到sun提供的串口包 javacomm20-win32.zipcomm.jar,我找了一下,这玩意有点太坑了,部署麻烦无比,而且还非常老,使用比较麻烦,甚至没有64位版本
由于本人需要一些特殊的应用,所以需要用到串口通讯。
于是自己编写了一个dll库类,使用jna加载,自动识别32位和64位版本。封装得非常简单,代码量也非常少,使用非常容易。
首先确保你有jna-4.2.1.jar这个类
下面贴出主要的类实现,其本质还是加载dll,已经在win7和win10下测试通过,用于本司的一个系统中
package com.siecom.test;
import java.io.File;
import java.io.IOException;
import com.sun.jna.Library;
import com.sun.jna.Native;
public class SerialPortWinChannel {
int portNo = 1;
int baud = 115200;
char parity = 'N';
int databits = 8;
int stopsbits = 1;
short dwCommEvents = 1;
byte[] buf = new byte[4096];
static String env = "x64";
static {
String arch = System.getProperty("sun.arch.data.model");
System.out.println(arch);
if (arch.equals("64")) {
env = "x64";
} else {
env = "x86";
}
}
public interface SerialPortForWin extends Library {
/**
*
* 当前路径是在项目下,而不是bin输出目录下。
*/
public SerialPortForWin INSTANCE = (SerialPortForWin) Native
.loadLibrary(env + File.separator + "serial_port_dll",
SerialPortForWin.class);
boolean InitPort(int portNo, int baud, char parity, int databits,
int stopsbits, short dwCommEvents);
void ClosePort();
boolean WriteData(byte[] pData, int length);
int ReadChar(byte[] cRecved, int want_read);
int GetBytesInCOM();
int fnSerialPortDLL();
}
public void setConfig(int portNo, int baud, char parity, int databits,
int stopsbits, short dwCommEvents) {
this.portNo = portNo;
this.baud = baud;
this.parity = parity;
this.databits = databits;
this.stopsbits = stopsbits;
this.dwCommEvents = dwCommEvents;
}
public int initChannel() {
// TODO Auto-generated method stub
if (SerialPortForWin.INSTANCE.InitPort(portNo, baud, parity, databits,
stopsbits, dwCommEvents)) {
return 0;
} else {
return -1;
}
}
public int write(byte[] command, int length) {
// TODO Auto-generated method stub
if(SerialPortForWin.INSTANCE.WriteData(command, length)){
return 0;
}
return -1;
}
public int available() throws IOException {
// TODO Auto-generated method stub
return SerialPortForWin.INSTANCE.GetBytesInCOM();
}
public int read(byte[] buffer, int offset, int length) {
// TODO Auto-generated method stub
int revCount =SerialPortForWin.INSTANCE.ReadChar(buf,length);
System.arraycopy(buf,0,buffer,offset,length);
return revCount;
}
public int reset() {
// TODO Auto-generated method stub
SerialPortForWin.INSTANCE.ClosePort();
initChannel();
return 0;
}
public void destroy() {
// TODO Auto-generated method stub
SerialPortForWin.INSTANCE.ClosePort();
}
}
提供工程下载:
http://download.csdn.net/detail/godghkj/9477301