在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. HDU 1524 A Chess Game【SG函数】

    题意:一个N个点的拓扑图,有M个棋子,两个人轮流操作,每次操作可以把一个点的棋子移动到它的一个后继点上(每个点可以放多个棋子),直到不能操作,问先手是否赢. 思路:DFS求每个点的SG值,没有后继的点 ...

  2. POJ2528Mayor's posters[线段树 离散化]

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 59683   Accepted: 17296 ...

  3. Java程序设计之线程池应用

    这里简单说一个线程池的小应用,从控制台输入线程访问的线程数量,输出输出工作的线程名,之前先构造一个包含了5条线程的对象. 代码: import java.util.Scanner; import ja ...

  4. [转载]我的Java后端书架 (2016年暖冬4.0版)

      [转载]我的Java后端书架 (2016年暖冬4.0版) ps:最近正在初学Java,有一些其他语言的底子,但是还是要好好看书,好好练习,网上找了好久,都没有这份书单来的实用,特意转载过来,方便以 ...

  5. c#读写xml文件

    using System; using System.Collections.Generic; using System.Xml; using System.Text.RegularExpressio ...

  6. WPScan用法

    kali下集成的WPScan用法 1.刺探基础信息:wpscan --url http://www.example.com 2.猜解后台用户名wpscan --url http://www.examp ...

  7. Java开发环境的搭建以及使用eclipse从头一步步创建java项目

    一.java 开发环境的搭建 这里主要说的是在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载最近的JDK即可..http://www.orac ...

  8. 攻克Spring

    http://www.cnblogs.com/dream-to-pku/p/5655247.html

  9. AppBox升级进行时 - Attach陷阱(Entity Framework)

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. Attach方法 前面我们已经多次使用Attach方法,上一次使用Attach ...

  10. WPF中RadioButton绑定数据的正确方法

    RadioButton一般用于单选的时候,也就是从一组值中选择一个值. 比如性别有“男”和“女”两种取值,而对于一个员工的实例来说,性别的取值要么是男,要么是女. 这种时候一般就会用到RadioBut ...