串口通讯

来源:互联网 发布:淘宝禁止发布违背 编辑:程序博客网 时间:2024/04/30 15:25
最近制作串口读取设备数据,跟串口打交道。使用大家都熟悉的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{;}   } }