Java 串口通信
在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 串口通信的更多相关文章
- java串口通信丢包
java串口通信丢包问题 前段时间公司要求做一个java应用和pos串口通信的工具,调试好了好久每次都是只能接收到一包数据后续的数据都丢失了. 经过修改读写的流的缓存大小亲测都正常代码如下: seri ...
- java 串口通信 代码
下面是我自己实现的串口接收的类,串口发送比较简单,就直接发送就可以了.下面的这个类可以直接使用. package com.boomdts.weather_monitor.util; import ja ...
- Java串口通信具体解释
序言 说到开源,恐怕非常少有人不挑大指称赞.学生通过开源码学到了知识,程序猿通过开源类库获得了别人的成功经验及可以按时完毕手头的project,商家通过开源软件赚到了钱……,总之是皆大欢喜.然而开源软 ...
- Java串口通信详细解释
前言 说到开源.恐怕非常少有人不挑大指称赞. 学生通过开源码学到了知识,程序猿通过开源类库获得了别人的成功经验及可以按时完毕手头的project,商家通过开源软件赚到了钱……,总之是皆大欢喜. 然而开 ...
- Java串口通信--------基于RXTX (附带资源地址)
最近帮老师做了一个小项目,一个牧场公司想用传感器收集一些环境信息,记录到数据库里去,然后加以分析查看.这里面和传感器通信用到了串口通信,我也是接触了一下,把用到的东西分享出来. 准备工作: RXTX: ...
- Java串口通信 RXTX 解决过程
背景介绍: 由于第一次用Java与硬件通信,网上查了许多资料,在这进行整理,便于以后学习.本人串口测试是USB串口设备连接电脑,在设备管理器中找到端口名称(也可以通过一些虚拟串口工具模拟). 下面主要 ...
- java 串口通信实现流程
1.下载64位rxtx for java 链接:http://fizzed.com/oss/rxtx-for-java 2.下载下来的包解压后按照说明放到JAVA_HOME即JAVA的安装路径下面去 ...
- Java 串口通信 Ubuntu
说一下我的操作过程吧 在Windows上先用阿猫串口网络调试助手,进行调试: 在网上找Java代码,我选择的是RXTXcomm,网上代码很多,基本都一样. 在Windows电脑上把rxtx压缩包中的r ...
- 【Java】基于RXTX的Java串口通信
本篇内容参考转载自https://blog.csdn.net/kong_gu_you_lan/article/details/80589859 环境搭建 下载地址:http://fizzed.com/ ...
随机推荐
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- Python-03-基础
一.集合 集合(set)是一个无序的.不重复的元素组合,它的主要作用如下: 去重:把一个列表变成集合,就会自动去重. 关系测试:测试两组数据之前的交集.差集.并集等关系. 常用操作 # 创建数值集合 ...
- C/C++实践笔记 006
字符与字符串字符按照%d,打印ASCCII字符按%c,打印字符本身‘0’ 0 ‘\0’区别: char ch3=0; 等号会自动转换,转换成ASCCII值所对应的字符.即null或\0C字符串不可以直 ...
- 持续集成(Continuous integration)
docker +jenkins + gitosc 到gitosc上,复制地址:https://git.oschina.net/99fu/CI.git 进入到 /home/fu git clone ...
- Winform开发:在ProgressBar显示百分比数字
如果不使用Label而是直接在进度条上显示文字,可以扩展一个派生类自己画,代码如下: public partial class Form1 : Form { public Form1() { Init ...
- 解决Xamarin Android墙的问题
Xamarin Android项目在编译时会从google的服务器下载缺失的m2repository相关文件,虽然不明白这是干什么的,但是情况就是Andorid SDK Manager不会去下载这个东 ...
- mysql按日期检索数据
说明: 按日期归类, 查询2016年5月1号到5月31号每天用户注册数量 直接上源码: select DATE_FORMAT( creationTime, "%Y-%m-%d" ) ...
- python中引入包的时候报错AttributeError: module 'sys' has no attribute 'setdefaultencoding'解决方法?
python中引入包的时候报错:import unittestimport smtplibimport timeimport osimport sysimp.reload(sys)sys.setdef ...
- BZOJ 3781: 小B的询问
3781: 小B的询问 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 643 Solved: 435[Submit][Status][Discuss ...
- Python【第一章】:简介和入门
ython简介 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承.之 ...