近期开发过程中遇到需要读取底层传感器串口数据的问题,也是从无到有的一个过程,爬了不少帖子在这里记录一下,也给后来的朋友们一点小小的帮助吧。
下载链接在文末

串口介绍

如图所示就是一种串口转换器:

Java对串口编程的API包

官方包:
1998年SUN发布的串口通信API:comm2.0.jar(Windows环境下)和comm3.0.jar(Linux/Solaris环境下);IBM发布的串口通信API;
但是sun已经停止了对commAPI的更新,现在使用的更多的是RXTX的jar包,下载链接百度RXTX官网就是

编程前准备

除了jar包以外,相信新出的台式电脑和笔记本电脑已经没有com接口了吧,在做测试之前我们选择虚拟两个串口出来,这里需要用到软件:vspdpro
后面我会整理出开发所需要的所有的软件,供大家下载的.

软件安装好以后,直接添加虚拟对就好了,选择你需要虚拟出的端口即可:

开始编程

使用Eclipse工具,新建一个maven工程,添加pom依赖,代替手工导入RXTX.jar

<!-- 添加对485接口的依赖 --><dependency><groupId>org.rxtx</groupId><artifactId>rxtx</artifactId><version>2.1.7</version></dependency>

读取所有可用串口,并打印
这里我使用的端口是8和12大家可以灵活处理

package com.shenlan.demo485;import java.util.Enumeration;import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.UnsupportedCommOperationException;public class RxtxDemo2 {public static void main(String[] args) {//定义表示端口的变量CommPortIdentifier portIdentifier = null;//定义记录每一个变量的枚举Enumeration portIdentifiers = CommPortIdentifier.getPortIdentifiers();//输出所有端口System.out.println("输出所有端口");while (portIdentifiers.hasMoreElements()) {portIdentifier  = (CommPortIdentifier) portIdentifiers.nextElement();System.out.println("串口:"+ portIdentifier.getName());}//获取两个端口CommPortIdentifier com8 =  null;CommPortIdentifier com12 =  null;try {com8 = CommPortIdentifier.getPortIdentifier("COM8");com12 = CommPortIdentifier.getPortIdentifier("COM12");} catch (NoSuchPortException  e) {// TODO: handle exceptione.printStackTrace();}//打开两个端口SerialPort serialCom8 = null;SerialPort serialCom12 = null;try {serialCom8=(SerialPort) com8.open("RxtxDemo2",1000);serialCom12=(SerialPort) com12.open("RxtxDemo2",1000);} catch (PortInUseException  e) {// TODO: handle exceptione.printStackTrace();}//设置端口参数try {serialCom8.setSerialPortParams(9600, //波特率SerialPort.DATABITS_8, //数据位 8SerialPort.STOPBITS_1,//停止位1 SerialPort.PARITY_NONE);//奇偶位serialCom12.setSerialPortParams(9600, //波特率SerialPort.DATABITS_8, //数据位 8SerialPort.STOPBITS_1,//停止位1 SerialPort.PARITY_NONE);//奇偶位} catch (UnsupportedCommOperationException  e) {// TODO: handle exceptione.printStackTrace();//关闭端口8和12serialCom8.close();serialCom12.close();}}
}

完成对端口的打开和输出之后,我们还需要完成端口与端口之间的收发信息
这里需要用到一个软件,叫做端口调试助手,同样我也会打包上传的
这里通过轮询的方式监听COM15端口,与之相连的串口是COM8

package com.shenlan.demo485;import java.io.IOException;
import java.io.InputStream;import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;public class Listener {/*** 通过轮询模式监听串口COM15* 当串口COM8传来数据的时候读取数据*/public static void main(String[] args) {CommPortIdentifier com15 = null;//定义需要接收数据的端口(未打开)SerialPort serialCom15 = null;//打开的端口InputStream inputStream = null;//端口输入流System.out.println("开始监听端口COM15收到的数据");try {//获取并打开串口com15com15 =CommPortIdentifier.getPortIdentifier("COM15");serialCom15 = (SerialPort) com15.open("Com15Listener", 1000);//System.out.println(serialCom15);//获取串口的输入流对象inputStream = serialCom15.getInputStream();//从串口读出数据//定义用于缓存读入数据的数组byte []cache = new byte[1024];//记录已经到达串口COM15且未被读取的数据的字节(Byte)数int availableBytes = 0;//通过无限循环的方式来扫描COM15,检查是否有数据到达端口,间隔20mswhile (true) {//获取串口15收到的字节数availableBytes = inputStream.available();//如果可用字节数大于0则开始转换并获取数据while (availableBytes>0) {//从串口的输入流对象中读入数据并将数据存放到缓存数组中inputStream.read(cache);//将获取到的数据进行转码并输出for (int i = 0; i < cache.length&&i<availableBytes; i++) {System.out.print((char)cache[i]);}System.out.println();availableBytes = inputStream.available();}//线程睡眠20msThread.sleep(20);   }}catch(InterruptedException e){e.printStackTrace();}catch (NoSuchPortException e) {//找不到串口的情况下抛出该异常e.printStackTrace();} catch (PortInUseException e) {//如果因为端口被占用而导致打开失败,则抛出该异常e.printStackTrace();} catch (IOException e) {//如果获取输出流失败,则抛出该异常e.printStackTrace();}}
}

此时通过串口调试助手向COM15发送消息
选择com8-com15以后点击开始,然后单击发送

COM15收到的消息被监听

至此监听端口类书写完成

接下来完后端口对端口的发送:
COM15发送到COM8

package com.shenlan.demo485;import java.io.IOException;
import java.io.OutputStream;import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;public class Write {/*** 是向COM8发送数据*/public static void main(String[] args) {//定义变量CommPortIdentifier  com8 = null;SerialPort  serialCom8 = null;try {//获取com8端口com8 = CommPortIdentifier.getPortIdentifier("COM8");//打开com8端口serialCom8 = (SerialPort) com8.open("Com8Writer",1000);//写入数据//获取串口输出流对象OutputStream outputStream = serialCom8.getOutputStream();//通过串口的输出流向串口写数据byte hello[] = new byte[] {'H','e','l','l','o',' ','W','o','r','l','d','!'};outputStream.write(hello);/** 使用输出流往串口写数据的时候必须将数据转换为byte数组格式或int格式,*  当另一个串口接收到数据之后再根据双方约定的规则,对数据进行解码*///关闭输出流outputStream.flush();serialCom8.close();//关闭串口} catch (NoSuchPortException  e) {//找不到串口的情况下抛出该异常 exceptione.printStackTrace();}catch (PortInUseException  e) {//如果因为端口被占用而导致打开失败,则抛出该异常e.printStackTrace();}catch (IOException e) {//如果获取输出流失败,则抛出该异常e.printStackTrace();}}
}

这里采用的是byte数组发送helloworld到端口,运行java类,可以在串口调试助手收到消息

注意:这里调试的时候需要把端口更改为COM15-COM8,这样就能收到消息了.
简单的调试就到这里,稍后我上传源码和文件供大家下载,包括jar包和串口调试助手和虚拟串口的vspdpro
链接:百度网盘

链接:https://pan.baidu.com/s/1ogoSCmWoHDn7gnu8cK45Zw
提取码:4b93
复制这段内容后打开百度网盘手机App,操作更方便哦

源码:
https://download.csdn.net/download/weixin_43616450/11906730

JAVA实现RS-485串口编程相关推荐

  1. java rxtx version_RXTX实现JAVA串口编程

    给大家分项下用RXTX库实现JAVA串口编程. 一 准备工作 1.1 下载资源文件 首先下载RXTX库对应的资源文件.下载地址 http://fizzed.com/oss/rxtx-for-java ...

  2. RXTX实现JAVA串口编程

    给大家分项下用RXTX库实现JAVA串口编程. 一 准备工作 1.1 下载资源文件 首先下载RXTX库对应的资源文件.下载地址 http://fizzed.com/oss/rxtx-for-java ...

  3. 嵌入式系统编程实现485串口收发数据

    从现在开始,对485串口进行研究,第一步先研究下485数据的收发,想完成的目的是分2个程序,一个收,一个发,这样设计的原因是因为485属于半双工,如果收发同时操作,那么在一个开发板内部测试会出现问题, ...

  4. 面向串口编程java_Java串口编程例子

    最近笔者接触到串口编程,网上搜了些资料,顺便整理一下.网上都在推荐使用Java RXTX开源类库,它提供了Windows.Linux等不同操作系统下的串口和并口通信实现,遵循GNU LGPL协议.看起 ...

  5. 基于MODBUS-RTU协议的串口编程

    首先给大家描述一下当前样例串口编程的场景,使用一个水位传感器来测试水库水位的高度,水位传感器连接数据采集器,数据采集器通过485串口和USB口转换器和电脑连接,电脑程序通过USB口读取水位传感器上传到 ...

  6. linux下的串口编程

    本文转自:http://www.cnblogs.com/jason-lu/articles/3173988.html 做人个人学习使用,绝无侵权之意.如果侵权,请尽快联系,谢谢. Linux下串口编程 ...

  7. C——Linux下的串口编程

    原 C--Linux下的串口编程 2017年06月06日 19:30:50 C_Aya 阅读数:11537 <span class="tags-box artic-tag-box&qu ...

  8. Linux下串口编程

    文章目录 串口 驱动 安装 设备文件 测试代码 编译运行 引用 串口 电平之类的就不说了,串口使用的一般包括rs232全双工,rs422四线全双工,rs485两线半双工,rs485四线全双工几种模式, ...

  9. Android串口编程

    Android串口编程 在2018年3月,我做了一个基于Android串口通信的Android App(公司项目). 在使用Google提供的android-serial-port开源工程时,发现该工 ...

最新文章

  1. 下载nodejs的mysql安装包下载_nodejs安装包下载|nodejs(javascript运行环境) v5.3.0 最新稳定版 - 软件下载 - 绿茶软件园|33LC.com...
  2. pytorch之深入理解collate_fn
  3. 关于webStrom-11.1配置less且自动生成.css和自动压缩为.min.css/.min.js
  4. 绝不能错过的10款最新OpenStack网络运维 监控工具
  5. window 日志清除
  6. python 类方法装饰器_python类装饰器即__call__方法
  7. adcclk最大_TMS320F28xxADC配置说明中文版
  8. mysql日活统计函数_如何通过简化日活模型,预估一个产品的日活(DAU)?
  9. 机器学习 | 梯度下降原理及Python实现
  10. 开源NewSQL – CockroachDB在百度内部的应用与实践
  11. 大话设计模式C++版——代理模式
  12. 用MySQL语言创建视图_mysql 创建视图
  13. **记录在win10电脑上使用Duet display的一次经历**
  14. 《中华人民共和国数据安全法》解读(1)
  15. 如何更改微信小程序二维码物料颜色
  16. CTS、CLS和CLR
  17. Win11还原Win10开始菜单及任务栏工具[Win7勿入]
  18. Word2007 无法给尾部空格加下划线
  19. 程序员的白酒里程(一)香型
  20. 哪有计算机课程,计算机基础课程的目标有以下哪几个( ? ?)

热门文章

  1. 【QtScrcpy】开源的投屏控制软件 - 安利
  2. 把字符串'123.456'转换成浮点数 123.456(廖雪峰,拓展)
  3. KEIL4/5的背景色修改
  4. 【javaWeb】第50天—— WEB实战项目二
  5. 线阵相机是如何定义的?
  6. Atlas 2.2.0 集成janusgraph 0.6.2
  7. 微信小程序调用后端接口
  8. 技能高考c语言经典试题及答案,技能练习题
  9. 宇视摄像机云台控制预置位、巡航如何配置
  10. [激光原理与应用-24]:《激光原理与技术》-10- 激光产生技术-调Q技术、Q开关、Q驱动器