最近制作串口读取设备数据,跟串口打交道。使用大家都熟悉的comm.jar开发。
下面简单介绍下自己的心得,希望对大家有所帮助
1. *.java加载dll文件,可运行的jar文件,调用时需要受到加载dll文件,方式如下:
/** 加载win32com.dll***************/
String driverName = "com.sun.comm.Win32Driver";//javax.comm.properties中Driver的值
CommDriver driver = null;
try {
System.loadLibrary("win32com");//dll名称
driver = (CommDriver) Class.forName(driverName).newInstance();
driver.initialize();
} catch (InstantiationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally{;}
/** ************** */
2. comm.jar使用
其中,openComm(int commInterval)所在类需要实现接口:SerialPortEventListener
/**
* @return 开启串口 false:开启失败、true:开启成功
*/
public boolean openComm(int commInterval){
try {
CommPortIdentifier identifier = CommPortIdentifier.getPortIdentifier(this.com);
if(identifier == null){
return isOpen;
}
this.commInterval = commInterval;
serialPort = (SerialPort) identifier.open("serialPort", commInterval);
serialPort.setSerialPortParams(this.burdate, this.databits, this.stopbits, this.parity);
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
serialPort.notifyOnOutputEmpty(true);
//读串口线程
//ReadFromCommuThread read = new ReadFromCommuThread(serialPort);
//read.start();
isOpen = true;
log.info("打开串口" + this.com + "成功!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
log.error("打开串口" + this.com + "失败!\n" + e.getMessage());
isOpen = false;
}finally{;}
return isOpen;
}
/**
* @param str
* @return 向串口发送信息
*/
public boolean sendToComm(byte[]sender){
boolean isSended = false;
if(sender != null){
try {
if(!isOpen){//打开串口
this.openComm(this.commInterval);
}
OutputStream os = serialPort.getOutputStream();
os.write(sender);
os.flush();
os.close();
isSended = true;
} catch (IOException e) {
// TODO Auto-generated catch block
log.error(e.getMessage());
}finally{;}
}
return isSended;
}
/**
* @return 读取串口
*/
public void readFromComm(){
if(serialPort != null){
try {
iis = serialPort.getInputStream();
Thread.sleep(this.commInterval);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
log.error("@@读取串口信息出错!!");
}finally{;}
}
}
/* (non-Javadoc)
* @see javax.comm.SerialPortEventListener#serialEvent(javax.comm.SerialPortEvent)
*/
public void serialEvent(SerialPortEvent event) {
// TODO Auto-generated method stub
if(event.getEventType() == SerialPortEvent.DATA_AVAILABLE){//数据到达
try {
if(iis != null){
byte[] bts = new byte[1];
while(iis.available() > 0){
iis.read(bts);
messageBak.append(CommuUtil.Bytes2HexString(bts));
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
log.error("@@读取数据出错!!");
}finally{;}
}
}