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后台开发精选知识图谱
地址 引言: 学习一个新的技术时,其实不在于跟着某个教程敲出了几行.几百行代码,这样你最多只能知其然而不知其所以然,进步缓慢且深度有限,最重要的是一开始就对整个学习路线有宏观.简洁的认识,确定大的学习 ...
随机推荐
- html的img标签
html显示图片 1.最简单: <img src="图片路径"/> 2.如果要改变图片显示的尺寸 <img src="图片路径" width= ...
- 【ES6】var、let、const三者的区别
首先,一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系? ECMAScript是一个国际通过的标准化脚本语言.JavaScript由ECMAScript和DOM.BOM ...
- B/S结构中页面间的传值
常见的页面间的传值有session,cookie,application,server.transfer(),queryString,今天主要记录一下server.transfer()的用法. 从A页 ...
- HTTP 错误 404.11 - Not Found 请求筛选模块被配置为拒绝包含双重转义序列的请求。
一些URL中可能会包含+号等符号,然后IIS7以上的版本会默认拒绝请求此URL,需要进行如下的修改. <configuration> <system.webServer> &l ...
- sqlserver - FOR XML PATH
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...
- JavaScript中解决多浏览器兼容性问题的方案
一.document.formName.item(”itemName”) 问题 问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 document. ...
- es入门教程
因为项目可能会用到es保存一些非结构化的数据,并从中检索数据.对es调研了一下 从官网:https://www.elastic.co/downloads下载,解压即安装. 进入解压目录,执行bin目录 ...
- 《JavaWeb从入门到改行》那些年一起学习的Servlet
目录 获取ServletContext : ServletContext接口中的一些方法 application域存取数据功能 代码演示: application域获取项目文件路径 代码演示: API ...
- Effective C++ .17 函数调用时的资源管理
以书上的代码为例 processWidget(shared_ptr<Widget>(new Widget), priority()) 虽然使用了智能指针来管理资源但是,由于参数值计算顺序的 ...
- 深入理解jQuery插件开发总结(四)
jQuery插件开发模式 软件开发过程中是需要一定的设计模式来指导开发的,有了模式,我们就能更好地组织我们的代码,并且从这些前人总结出来的模式中学到很多好的实践. 根据<jQuery高级编程&g ...