在Windows系统下,用Java开发串口通信相关的程序时,需要用到几个文件。

(1)win32com.dll 要放在jdk\jre\bin目录下。

(2)comm.jar 和javax.comm.properties要放在jdk\jre\lib目录下。

下面是如何使用SerialPort的Demo:

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package tina; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.TooManyListenersException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.comm.CommPortIdentifier;
import javax.comm.NoSuchPortException;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import javax.comm.UnsupportedCommOperationException;
import javax.swing.JOptionPane; /**
*
* @author Tina
*/
public class DemoCom implements SerialPortEventListener { private static final String PORT_NAME = "COM4"; //串口号
private static final int PORT_BAUDRATE = 115200; //波特率
private static DemoCom instance;
private final SerialPort mSerialPort;
private final PrintWriter mWriter;
private final InputStream mInputStream;
private OnMsgArrivedListener mListener;
private final StringBuffer buffer = new StringBuffer(); public interface OnMsgArrivedListener { //收到字符
void OnMsgArrived(char c); } private DemoCom(CommPortIdentifier portId, int baudrate) throws PortInUseException, UnsupportedCommOperationException, IOException {
mSerialPort = (SerialPort) portId.open("DemoCom", baudrate);
mSerialPort.setSerialPortParams(baudrate,
SerialPort.DATABITS_8, //Data Bits
SerialPort.STOPBITS_1, //Stop Bits
SerialPort.PARITY_NONE); //无校验
mSerialPort.notifyOnDataAvailable(true); OutputStream mOutputStream = mSerialPort.getOutputStream();
mInputStream = mSerialPort.getInputStream();
mWriter = new PrintWriter(mOutputStream);
} public static DemoCom getInstance() {
if (instance == null) {
CommPortIdentifier portId;
try {
portId = (CommPortIdentifier) CommPortIdentifier.getPortIdentifier(PORT_NAME);
instance = new DemoCom(portId, PORT_BAUDRATE);
} catch (NoSuchPortException ex) {
JOptionPane.showMessageDialog(null, "没有找到串口" + PORT_NAME + ",请确认USB线是否连接好!");
System.exit(0);
} catch (PortInUseException ex) {
JOptionPane.showMessageDialog(null, "串口" + PORT_NAME + "被占用,请关闭其他可能占用的应用软件!");
System.exit(0);
} catch (UnsupportedCommOperationException ex) {
JOptionPane.showMessageDialog(null, "串口" + PORT_NAME + "打开失败:" + ex.getMessage());
System.exit(0);
} catch (IOException ex) {
JOptionPane.showMessageDialog(null, "串口" + PORT_NAME + "打开失败:" + ex.getMessage());
System.exit(0);
}
}
return instance;
} @Override
public void serialEvent(SerialPortEvent spe) {
if (spe.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
while (mInputStream.available() > 0) {
//处理数据
int c = mInputStream.read();
buffer.append((char) c);
//这里只是将数据传到其他需要监听串口数据的地方
if (mListener != null) {
mListener.OnMsgArrived((char) c);
} }
} catch (IOException ex) {
Logger.getLogger(PortFixture.class.getName()).log(Level.SEVERE, null, ex);
}
}
} public String sendAndGet(String command, int delayMs) {
//发送命令
if (mWriter != null) {
mWriter.println(command);
mWriter.flush();
}
//延时
try {
Thread.sleep(delayMs);
} catch (InterruptedException ex) {
Logger.getLogger(PortFixture.class
.getName()).log(Level.SEVERE, null, ex);
}
//查看回复的数据
if (!buffer.toString().isEmpty()) { //如果buffer非空
String str = buffer.toString();
System.out.println(buffer.toString());
buffer.delete(0, buffer.length());//读完之后清空
return str;
} else {
return "";
}
} public void send(String command) {
buffer.delete(0, buffer.length());//发送之前清空 try {
Thread.sleep(10);
} catch (InterruptedException ex) {
Logger.getLogger(PortFixture.class.getName()).log(Level.SEVERE, null, ex);
}
//发送命令
if (mWriter != null) {
mWriter.println(command);
mWriter.flush();
}
} public void open() {
try {
mSerialPort.addEventListener(this);
} catch (TooManyListenersException ex) {
Logger.getLogger(PortFixture.class
.getName()).log(Level.SEVERE, null, ex);
} //打开串口后,做一些处理
if (!sendAndGet("reset", 1000).toLowerCase().contains("ok")) {
JOptionPane.showMessageDialog(null, "无法复位!");
System.exit(0);
}
} public void close() {
if (mWriter != null) {
mWriter.close();
} if (mInputStream != null) {
try {
mInputStream.close();
} catch (IOException ex) {
Logger.getLogger(PortFixture.class.getName()).log(Level.SEVERE, null, ex);
}
}
if (mSerialPort != null) {
mSerialPort.close();
}
} public void setOnMsgArrivedListener(OnMsgArrivedListener listener) {
mListener = listener;
}
}

Java 串口通信的更多相关文章

  1. java串口通信丢包

    java串口通信丢包问题 前段时间公司要求做一个java应用和pos串口通信的工具,调试好了好久每次都是只能接收到一包数据后续的数据都丢失了. 经过修改读写的流的缓存大小亲测都正常代码如下: seri ...

  2. java 串口通信 代码

    下面是我自己实现的串口接收的类,串口发送比较简单,就直接发送就可以了.下面的这个类可以直接使用. package com.boomdts.weather_monitor.util; import ja ...

  3. Java串口通信具体解释

    序言 说到开源,恐怕非常少有人不挑大指称赞.学生通过开源码学到了知识,程序猿通过开源类库获得了别人的成功经验及可以按时完毕手头的project,商家通过开源软件赚到了钱……,总之是皆大欢喜.然而开源软 ...

  4. Java串口通信详细解释

    前言 说到开源.恐怕非常少有人不挑大指称赞. 学生通过开源码学到了知识,程序猿通过开源类库获得了别人的成功经验及可以按时完毕手头的project,商家通过开源软件赚到了钱……,总之是皆大欢喜. 然而开 ...

  5. Java串口通信--------基于RXTX (附带资源地址)

    最近帮老师做了一个小项目,一个牧场公司想用传感器收集一些环境信息,记录到数据库里去,然后加以分析查看.这里面和传感器通信用到了串口通信,我也是接触了一下,把用到的东西分享出来. 准备工作: RXTX: ...

  6. Java串口通信 RXTX 解决过程

    背景介绍: 由于第一次用Java与硬件通信,网上查了许多资料,在这进行整理,便于以后学习.本人串口测试是USB串口设备连接电脑,在设备管理器中找到端口名称(也可以通过一些虚拟串口工具模拟). 下面主要 ...

  7. java 串口通信实现流程

    1.下载64位rxtx for java 链接:http://fizzed.com/oss/rxtx-for-java 2.下载下来的包解压后按照说明放到JAVA_HOME即JAVA的安装路径下面去 ...

  8. Java 串口通信 Ubuntu

    说一下我的操作过程吧 在Windows上先用阿猫串口网络调试助手,进行调试: 在网上找Java代码,我选择的是RXTXcomm,网上代码很多,基本都一样. 在Windows电脑上把rxtx压缩包中的r ...

  9. 【Java】基于RXTX的Java串口通信

    本篇内容参考转载自https://blog.csdn.net/kong_gu_you_lan/article/details/80589859 环境搭建 下载地址:http://fizzed.com/ ...

随机推荐

  1. 【Python数据分析】Python模拟登录(一) requests.Session应用

    最近由于某些原因,需要用到Python模拟登录网站,但是以前对这块并不了解,而且目标网站的登录方法较为复杂, 所以一下卡在这里了,于是我决定从简单的模拟开始,逐渐深入地研究下这块. 注:本文仅为交流学 ...

  2. 第7章 权限管理(2)_文件特殊权限(SUID、SGID、SBIT)

    2. 文件特殊权限(主要用来临时提升命令执行者或其组身份) 2.1 SetUID (1)SetUID的功能 ①只有可以执行的二进制程序才能设定SUID权限.用来临时提升执行程序(或某条命令)的用户身份 ...

  3. node-sass安装不成功的解决方案

    最近在学webpack,需要用到sass-loader加载器解析.scss文件,安装sass-loader,必须先安装node-sass,node-sass纠正了两天,用npm install nod ...

  4. Java的容器类Collection和Map

    一,概念 JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. java的容器类一共有两种主要类型,Colllection和Map. 两者的区别是:Collection是单个元素,而Map是存 ...

  5. 为什么 Java 8 中不再需要 StringBuilder 拼接字符串

    为什么 Java 8 中不再需要 StringBuilder 拼接字符串 来源:codeceo 发布时间:2016-12-27 阅读次数:427 0   在Java开发者中,字符串的拼接占用资源高往往 ...

  6. Mac Pro 下使用svn

    Mac 默认都会安装有svn 1.在项目下使用命令启动svn服务---svnserve -d -r 输入下列指令:svnserve -d -r /Users/apple/svn 或者输入:svnser ...

  7. css实现了hover显示title的效果

    <div data-title="hello, world">hello...</div> <style> div { position: re ...

  8. VisualStudio配色方案

    最近发现一个很神奇的网站,可以方便的为VisualStudio配色:Studio Styles - Visual Studio color schemes 可以下载一份自己喜欢的配色方案 如果还不满意 ...

  9. 求n!质因数分解之后素数a的个数

    n!质因数分解后P的个数=n/p+n/(p*p)+n/(p*p*p)+......直到n<p*p*p*...*p //主要代码,就这么点东西,数学真是厉害啊!幸亏我早早的就退了数学2333 do ...

  10. BZOJ 4568 幸运数字

    题目传送门 4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MB Description A 国共有 n 座城市,这些城市由 n-1 ...