JAVA串口开发帮助类分享-及写在马年末
摘要: 在系统集成开发过程中,存在着各式的传输途径,其中串口经常因其安全性高获得了数据安全传输的重用,通过串口传输可以从硬件上保证数据传输的单向性,这是其它介质所不具备的物理条件。下面我就串口java开发的过程分享一下,并分享一个SerialPortHandler串口开发帮助类,以提高串口开发效率。并附带了一些近期的总结,出差的体会。

public class SerialPortHandler implements Runnable, SerialPortEventListener
{
private String appName = "串口通讯";
private final static int timeout = 2000;// open 端口时的等待时间
private final static int dataBits = 8;// 数据位
private final static int stopBits = 1;// 停止位
private final static int parity = 0;// 校验位
private String portName;
private int baudRate;// 波特率
private int threadTime = 0;
private CommPortIdentifier commPort;
private SerialPort serialPort;
private InputStream inputStream;
private OutputStream outputStream;
private static ConcurrentHashMap<String, SerialPortHandler> instances = new ConcurrentHashMap<String, SerialPortHandler>();
private SerialPortHandler()
{
}
public static synchronized SerialPortHandler getInstance(String portName,
int baudRate) throws NoSuchPortException
{
SerialPortHandler instance;
if (!instances.containsKey(portName))
{
instance = new SerialPortHandler();
instance.portName = portName;
instance.baudRate = baudRate;
instances.put(portName, instance);
instance.selectPort();
}
else
{
instance = instances.get(portName);
}
return instance;
}
/**
* @方法名称 :listPort
* @功能描述 :列出所有可用的串口
* @返回值类型 :void
*/
public static void listPort()
{
CommPortIdentifier cpid;
Enumeration en = CommPortIdentifier.getPortIdentifiers();
System.out.println("now to list all Port of this PC:" + en);
while (en.hasMoreElements())
{
cpid = (CommPortIdentifier) en.nextElement();
if (cpid.getPortType() == CommPortIdentifier.PORT_SERIAL)
{
System.out.println(cpid.getName() + ", "
+ cpid.getCurrentOwner());
}
}
}
/**
* @方法名称 :selectPort
* @功能描述 :选择一个端口,比如:COM1
* @返回值类型 :void
* @param portName
* @throws NoSuchPortException
*/
@SuppressWarnings("rawtypes")
private void selectPort() throws NoSuchPortException
{
this.commPort = CommPortIdentifier.getPortIdentifier(portName);
openPort();
}
/**
* @方法名称 :openPort
* @功能描述 :打开SerialPort
* @返回值类型 :void
*/
private void openPort()
{
if (commPort == null)
log(String.format("无法找到名字为'%1$s'的串口!", commPort.getName()));
else
{
log("端口选择成功,当前端口:" + commPort.getName() + ",现在实例化 SerialPort:");
try
{
serialPort = (SerialPort) commPort.open(appName, timeout);
serialPort.setSerialPortParams(baudRate, dataBits, stopBits,
parity);
log("实例 SerialPort 成功!");
}
catch (PortInUseException e)
{
throw new RuntimeException(String.format("端口'%1$s'正在使用中!",
commPort.getName()));
}
catch (UnsupportedCommOperationException e)
{
throw new RuntimeException(String.format("端口'%1$s'操作命令不支持!",
commPort.getName()));
}
}
}
/**
* @方法名称 :checkPort
* @功能描述 :检查端口是否正确连接
* @返回值类型 :void
*/
private void checkPort()
{
if (commPort == null)
throw new RuntimeException("没有选择端口,请使用 "
+ "selectPort(String portName) 方法选择端口");
if (serialPort == null)
{
throw new RuntimeException("SerialPort 对象无效!");
}
}
/**
* @方法名称 :write
* @功能描述 :向端口发送数据,请在调用此方法前 先选择端口,并确定SerialPort正常打开!
* @返回值类型 :void
* @param message
*/
public void write(String message)
{
checkPort();
try
{
outputStream = new BufferedOutputStream(
serialPort.getOutputStream());
}
catch (IOException e)
{
throw new RuntimeException("获取端口的OutputStream出错:" + e.getMessage());
}
try
{
outputStream.write(message.getBytes());
log("信息发送成功!");
}
catch (IOException e)
{
throw new RuntimeException("向端口发送信息时出错:" + e.getMessage());
}
finally
{
try
{
outputStream.close();
}
catch (Exception e)
{
}
}
} |
public static void sendBySerialPorts(String contant)
{
contant = contant.replaceAll("\\$", ""); // 这里使用$符号作为终止符
contant = contant.concat("$");
SerialPortHandler sph;
try
{
sph = SerialPortHandler.getInstance(
DriveOutConductConfig.getPortName(),
DriveOutConductConfig.getBitRate());
sph.write(contant);
}
catch (NoSuchPortException e)
{
e.printStackTrace();
}
} |
JAVA串口开发帮助类分享-及写在马年末的更多相关文章
- Java Web 开发利用Struts2+Spring+mybatis写一个用户登录界面以及简单的数据交互
框架的东西太复杂也难以讲通,直接上代码: 一.首先得配置环境 和导入必要的jar包 有一些重要的如下: Filter文件夹下的SafetyFilter.java model文件夹下的 Global ...
- java常用开发工具类之 图片水印,文字水印,缩放,补白工具类
import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...
- java ee开发常用类和接口
1.javax.Validation接口,做mvc传入数据验证用 2.javax.servlet接口 3.javax.datasource接口 4.javax.session接口 5.javax.ht ...
- 近期Java高级开发岗面试总结
原文出处:公众号:编程大道 作者:walking 近期Java高级开发岗面试总结 哈喽大家好,我是walking,这是我的公众号:编程大道. 很久没和大家见面了,文章更新的速度略有延后.这个公众号断断 ...
- 分享:写了一个 java 调用 C语言 开发的动态库的范例
分享:写了一个 java 调用 C语言 开发的动态库的范例 cfunction.h 代码#pragma once#ifdef __cplusplusextern "C" {#e ...
- 分享 Java微信开发SDK
分享 Java微信开发SDK •发布于 4周前 •作者 朋也 •432 次浏览 •最后一次编辑是 2周前 •来自 分享 给大家分享两个java开发微信公众号的sdk jfinal-weixin ...
- 自己写的java excel导出工具类
最近项目要用到excel导出功能,之前也写过类似的代码.因为这次项目中多次用到excel导出.这次长了记性整理了一下 分享给大伙 欢迎一起讨论 生成excel的主工具类: public class E ...
- 【Java面试题】53 能不能自己写个类,也叫java.lang.String?
可以,但是即使你写了这个类,也没有用. 这个问题涉及到加载器的委托机制,在类加载器的结构图(在下面)中,BootStrap是顶层父类,ExtClassLoader是BootStrap类的子类,ExtC ...
- 【分享】Java后台开发精选知识图谱
地址 引言: 学习一个新的技术时,其实不在于跟着某个教程敲出了几行.几百行代码,这样你最多只能知其然而不知其所以然,进步缓慢且深度有限,最重要的是一开始就对整个学习路线有宏观.简洁的认识,确定大的学习 ...
随机推荐
- JAVA源码之JDK(二)——Integer、Long、Double
这篇文章继续java.lang包下的源码学习,笔者也是找了几个比较常用的来阅读.下面针对Integer.Long.Double这样的基本类型的封装类,记录一些比较经典.常用的方法的学习心得,如toSt ...
- FileReader实现上传图片前本地预览
平时做图片上传预览时如果没有特殊的要求就直接先把图片传到后台去,成功之后拿到URL再渲染到页面上.或者使用前端插件.这篇博客使用的是HTML5的新特性——FileReader.由于兼容性,这种方法不适 ...
- 如何优雅的封装一个DOM事件库
1.DOM0级事件和DOM2级事件 DOM 0级事件是元素内的一个私有属性:div.onclick = function () {},对一个私有属性赋值(在该事件上绑定一个方法).由此可知DOM 0级 ...
- js 打印指定页面部分打印
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- Redis - 事务操作
Redis的事务基于四个命令: MULTI EXEC DISCARD WATCH 创建事务 Redis的事务从一个MULTI命令开始,MULTI总会命令返回"ok". 接着就可以开 ...
- 游标的小知识(转载and整理)
一.游标(用来存储多条查询数据的一种数据结构(结果集),它有一个指针,用来从上往下移动,从而达到遍历每条记录的作用) 游标也可以理解为逐行返回SQL语句的结果集 如何编写一个游标? 1.声明游标 de ...
- webpack使用extract-text-webpack-plugin打包时提示错误Use Chunks.groupsIterable and filter by instanceof Entryp
转自:https://blog.csdn.net/gezilan/article/details/80020417 前提条件: 当前时间是2018年4月20日. webpack的最新版本为是 v4.6 ...
- redis(3)发布订阅
一.发布/订阅模式 在软件工程里面,发布/订阅是一种消息模式,这种模式旨在将消息发送者和消息接收者解耦.发送者不需要关心将消息发送给谁,接收者也不需要知道消息的发送者是谁.发送者将消息发布以后就结束动 ...
- tr设置display属性时,在FF中td合并在第一个td中显示的问题
今天用firefox测试页面的时候,发现用javascript控制 tr 的显示隐藏时,当把tr的显示由“display:none”改为“display:block”时,该tr下的td内容合并到了 ...
- hibernate5的一些坑
SessionFactory创建的修改 如果你是刚刚从hibernate4升级到hibernate5,这时候你的项目肯定就要出错了,什么错呢? org.hibernate.MappingExcepti ...