串口通讯

简介:
最近制作串口读取设备数据,跟串口打交道。使用大家都熟悉的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{;} 
  }
 }

相关文章
|
负载均衡 5G
频谱利用 | 带你读《5G 空口设计与实践进阶 》之二十
NR 单载波最大支持 275 个 RB,即 3300 个子载波。这相应也约束了不同Numerology 下 NR 的最大工作带宽。NR 须通过合理设置保护带宽来降低误差矢量幅度、抑制相邻频道泄漏。
频谱利用 | 带你读《5G 空口设计与实践进阶 》之二十
|
5月前
|
人工智能 缓存 Java
用 AI 搭建秒杀平台后端,一周搞定所有功能(附超详细踩坑记录)
本文分享如何借助AI技术快速搭建电商秒杀平台后端。通过飞算JavaAI,从需求分析到代码生成全流程智能化,大幅提高开发效率。文章详细记录了技术栈选择(Java、Spring Boot、MySQL、Redis)、系统架构设计、缓存机制优化、数据一致性保障及测试调优等环节,解决高并发难题,助开发者高效完成秒杀平台构建并规避常见坑点。
|
JavaScript 前端开发 定位技术
从 vue 响应式原理出发实现特定对象禁止响应化
从 vue 响应式原理出发实现特定对象禁止响应化
705 1
从 vue 响应式原理出发实现特定对象禁止响应化
西门子S7-200 SMART如何用存储卡复位CPU出厂设置、固件升级、程序传输
上篇文章中我们学习了西门子S7-200 SMART的全局变量和局部变量以及如何编写带参数子程序并调用,本篇我们来介绍西门子S7-200 SMART使用存储卡复位CPU到出厂设置、固件升级和程序传输。S7-200 SMART CPU使用FAT32文件系统格式,支持容量为4G至32G范围内的标准商用MicroSD HC卡。
西门子S7-200 SMART如何用存储卡复位CPU出厂设置、固件升级、程序传输
|
JavaScript Dubbo 数据可视化
8 月份 GitHub 最火的 6 个 Java 开源项目
8 月份 GitHub 上最热门的 Java 开源项目排行新鲜出炉,一起来看看~
1740 0
8 月份 GitHub 最火的 6 个 Java 开源项目
|
SQL 存储 druid
分布式数据库Greenplum基本原理和使用
Greenplum主要由Master节点、Segment节点、interconnect三大部分组成。Master 系统的入口,接受客户端连接及提交的SQL语句,将工作负载分发给其它数据库实例(segment实例),不存放任何用户数据,只是对客户端进行访问控制和存储表分布逻辑的元数据Segment节点负责数据的存储,可以对分布键进行优化以充分利用Segment节点的io性能来扩展整集群的io性能
分布式数据库Greenplum基本原理和使用
|
程序员 定位技术 vr&ar
最新 iOS 库 打包篇.a .bundle .framework
库是共享程序代码的方式,一般分为静态库和动态库。库是程序代码的集合,是共享程序代码的一种方式
1011 0
最新 iOS 库 打包篇.a .bundle .framework
|
移动开发 数据可视化 JavaScript
由物联网和数字孪生技术带来的web人机交互的进化
在物联网和数字孪生技术蓬勃发展的现在,传统网页的查询、刷新是否已经过时?基于web的应用将会面临怎么样的人机交互方式?
659 1
由物联网和数字孪生技术带来的web人机交互的进化
|
算法 计算机视觉 数据格式
用 Python 对图片主体轮廓进行提取、颜色标记、并计算区域面积
Python + Opencv2 实现轮廓提取,轮廓区域面积计算; 对图像处理时,会遇到这样一个场景:找到图像主体轮廓,这是其一,可能为了凸显轮廓,需要用指定的颜色进行标记;轮廓标记完可能任务还没有结束,还需对轮廓所勾勒的像素面积区域统计计算。
用 Python 对图片主体轮廓进行提取、颜色标记、并计算区域面积
|
机器学习/深度学习 自然语言处理 算法
对比学习(Contrastive Learning)在CV与NLP领域中的研究进展(一)
对比学习(Contrastive Learning)在CV与NLP领域中的研究进展(一)
1162 0
对比学习(Contrastive Learning)在CV与NLP领域中的研究进展(一)