首先,我们必须建立一个良好的环境,那是,jdk并且tomcat。如果它不必须是web装了!
还有就是配置,也就是默认的comm.jar ,javax.comm.properties , win32com.dll这几个文件要放对地方 comm.jar放到C:\Program Files (x86)\Java\jdk1.7.0_01\jre\lib\ext 同一时候也放到jre同样文件夹下 javax.comm.properties放到 C:\Program Files (x86)\Java\jdk1.7.0_01\jre\lib 也放到jre下 win32com.dll放到C:\Program Files (x86)\Java\jdk1.7.0_01\jre\bin也放到jre下 同一时候
win32com.dll也放到c:windows下的System32下 也把comm.jar配置到classpath下 这个弄好了就是编程序了 package com.serial; import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.TooManyListenersException; import javax.comm.CommPortIdentifier;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener; /**
* @项目名称 :illegalsms
* @文件名 :SerialPort.java
* @所在包 :org.serial
* @功能描写叙述 : 串口类
* @创建日期 :2012-9-13
* @改动记录 :
*/
public class DSerialPort implements Runnable, SerialPortEventListener { private String appName = "串口通讯測试";
private int timeout = 2000;// open 端口时的等待时间
private int threadTime = 0; private CommPortIdentifier commPort;
private SerialPort serialPort;
private InputStream inputStream;
private OutputStream outputStream; /**
* @方法名称 :listPort
* @功能描写叙述 :列出全部可用的串口
* @返回值类型 :void
*/
@SuppressWarnings("rawtypes")
public 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
*/
@SuppressWarnings("rawtypes")
public void selectPort(String portName) { this.commPort = null;
CommPortIdentifier cpid;
Enumeration en = CommPortIdentifier.getPortIdentifiers();
while (en.hasMoreElements()) {
cpid = (CommPortIdentifier) en.nextElement();
if (cpid.getPortType() == CommPortIdentifier.PORT_SERIAL
&& cpid.getName().equals(portName)) {
this.commPort = cpid;
break;
}
} 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);
log("实例 SerialPort 成功!");
} catch (PortInUseException 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) {
}
}
} /**
* @方法名称 :startRead
* @功能描写叙述 :開始监听从端口中接收的数据
* @返回值类型 :void
* @param time
* 监听程序的存活时间,单位为秒。0 则是一直监听
*/
public void startRead(int time) {
checkPort(); try {
inputStream = new BufferedInputStream(serialPort.getInputStream());
} catch (IOException e) {
throw new RuntimeException("获取端口的InputStream出错:" + e.getMessage());
} try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {
throw new RuntimeException(e.getMessage());
} serialPort.notifyOnDataAvailable(true); log(String.format("開始监听来自'%1$s'的数据--------------", commPort.getName()));
if (time > 0) {
this.threadTime = time * 10;
Thread t = new Thread(this);
t.start();
log(String.format("监听程序将在%1$d秒后关闭。 。。 。 ", threadTime));
}
} /**
* @方法名称 :close
* @功能描写叙述 :关闭 SerialPort
* @返回值类型 :void
*/
public void close() {
serialPort.close();
serialPort = null;
commPort = null;
} public void log(String msg) {
System.out.println(appName + " --> " + msg);
} /**
* 数据接收的监听处理函数
*/
@Override
public void serialEvent(SerialPortEvent arg0) {
switch (arg0.getEventType()) {
case SerialPortEvent.BI:/* Break interrupt,通讯中断 */
case SerialPortEvent.OE:/* Overrun error,溢位错误 */
case SerialPortEvent.FE:/* Framing error。传帧错误 */
case SerialPortEvent.PE:/* Parity error,校验错误 */
case SerialPortEvent.CD:/* Carrier detect,载波检測 */
case SerialPortEvent.CTS:/* Clear to send,清除发送 */
case SerialPortEvent.DSR:/* Data set ready,数据设备就绪 */
case SerialPortEvent.RI:/* Ring indicator,响铃指示 */
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:/*
* Output buffer is
* empty,输出缓冲区清空
*/
break;
case SerialPortEvent.DATA_AVAILABLE:/*
* Data available at the serial
* port,端口有可用数据。读到缓冲数组。输出到终端
*/
byte[] readBuffer = new byte[1024];
String readStr = "";
String s2 = ""; try { while (inputStream.available() > 0) {
inputStream.read(readBuffer);
readStr += new String(readBuffer).trim();
} s2 = new String(readBuffer).trim(); log("接收到端口返回数据(长度为" + readStr.length() + "):" + readStr);
log(s2);
} catch (IOException e) {
}
}
} @Override
public void run() {
try {
Thread.sleep(threadTime);
serialPort.close();
log(String.format("端口''监听关闭了。", commPort.getName()));
} catch (Exception e) {
e.printStackTrace();
}
}
} 还有就是 package com.serial; public class TestSerial {
public static final String PORT_NAME = "COM1"; public static void main(String[] args) { DSerialPort sp = new DSerialPort(); sp.listPort(); sp.selectPort(PORT_NAME);
sp.write("O(00,20,0)E");
sp.startRead(5);
}
} 要是在web上使用的话 就要建一web serviceproject
建议用eclipse j2ee版的,然后建一个web项目 然后创建同样的类放里面。然后再创建一个servlet package com.serial.servlet; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.serial.DSerialPort; /**
* Servlet implementation class RunServlet
*/
public class RunServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public RunServlet() {
super();
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter(); // String code = "O(00,20,1)E";
String address = request.getParameter("address"); // 地址
String state = request.getParameter("state"); // 状态
String bofile = request.getParameter("file"); // 视频地址
if (address != null && state != null) {
runSerial(address, state, bofile);
} else {
address = "00";
state = "0";
runSerial(address, state, bofile);
}
System.out.println("bofile:" + bofile);
} // 运行串口
public void runSerial(String address, String state, String bofile) {
if (address != null && state != null) {
String PORT_NAME = "COM1";
String code = "O(00," + address + "," + state + ")E";
DSerialPort sp = new DSerialPort();
sp.listPort();
sp.selectPort(PORT_NAME);
sp.write(code);
/* if (bofile != null) { */
if (state.equals("1")) {
play(bofile);
}
/* } */
sp.startRead(1); }
} // 播放视频
public void play(String path) {
System.out.println("path:" + path);
// String
// potplayer="D:/The entertainment software/PotPlayer/PotPlayerMini64.exe";
String mediaPath = "C:/MPlayer_Windows/mplayer/MPlayer.exe"; // 文件路径
// 调用mplayer命令行
String cmd = " -vo directx identify wid String.valueOf(false) -colorkey 0x030303 -slave -osdlevel String.valueOf(1)"
+ " -fullscreen";
try {
Process rn = Runtime.getRuntime().exec(
mediaPath + " " + path + " " + cmd); // 在单独的进程中运行指定命令和变量 /*
* Process rn = Runtime.getRuntime().exec( potplayer + " " + path);
* // 在单独的进程中运行指定命令和变量
*/
System.out.println("视频開始播放");
} catch (IOException e1) {
e1.printStackTrace();
return;
}
}
} 我这个是再加了一个播放视频的 说的非常easy,要是有不知道,我可以。我可以来探索哦,QQ在左上角

版权声明:本文博主原创文章,博客,未经同意不得转载。

Java使用串行编程操作继电器的更多相关文章

  1. vue使用技巧:Promise + async + await 解决组件间串行编程问题

    业务场景描述 大家都通过互联网投递过简历,比如在智联.58.猎聘等平台.投递心仪的职位前一般都需要前提创建一份简历,简历编辑界面常规的布局最上面是用户的个人基本信息,如姓名.性别.年龄.名族等,接着是 ...

  2. java的串行化

    参考博客:Java 对象的串行化(Serialization) 1,什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象 ...

  3. 了解java虚拟机—串行回收器(6)

    串行回收器 串行回收器只有一个工作线程,串行回收器可以在新生代和老年代使用,根据作用于不同的堆和空间,分为新生代串行回收器和老年代串行回收器. 1.新生代串行回收器 串行收集器是所有垃圾回收器中最古老 ...

  4. 搞定 CompletableFuture,并发异步编程和编写串行程序还有什么区别?你们要的多图长文

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  5. 【高速接口-RapidIO】3、RapidIO串行物理层的包传输过程

    一.引言 前几篇文章已经谈到RapidIO的协议,串行物理层与控制符号. RapidIO协议包括读事务(NREAD),写事务(NWRITE),流写事务(SWRITE),有响应的写事务(NWRITE_R ...

  6. 【高速接口-RapidIO】2、RapidIO串行物理层的包与控制符号

    一.RapidIO串行物理层背景介绍 上篇博文提到RapidIO的物理层支持串行物理层与并行物理层两种,由于Xilinx 部分FPGA内部已经集成了串行高速收发器,所以用FPGA实现RapidIO大多 ...

  7. 2.RapidIO串行物理层的包与控制符号

    转自https://www.cnblogs.com/liujinggang/p/9932150.html 一.RapidIO串行物理层背景介绍 上篇博文提到RapidIO的物理层支持串行物理层与并行物 ...

  8. 3.RapidIO串行物理层的包传输过程

    转自https://www.cnblogs.com/liujinggang/p/10005431.html 一.引言 前几篇文章已经谈到RapidIO的协议,串行物理层与控制符号. RapidIO协议 ...

  9. 使用Scala实现Java项目的单词计数:串行及Actor版本

    其实我想找一门“具有Python的简洁写法和融合Java平台的优势, 同时又足够有挑战性和灵活性”的编程语言. Scala 就是一个不错的选择. Scala 有很多语言特性, 建议先掌握基础常用的: ...

随机推荐

  1. C#实现仿QQ震动

    前提:新建winForm窗体应用程序,放置一个Button,设置按钮的单击事件 ; i < ; i++) { Point p = this.FindForm().Location; ,p.Y+) ...

  2. Windows phone 8 学习笔记(6) 多任务

    原文:Windows phone 8 学习笔记(6) 多任务 Windows phone 8 是一个单任务操作系统,任何时候都只有一个应用处于活跃状态,这里的多任务是指对后台任务的支持.本节我们先讲讲 ...

  3. Multitasking Apps may only use background services for their intended purposes

    2.16 Details Your app declares support for audio in the UIBackgroundModes key in your Info.plist, bu ...

  4. Preview of Spring-framework :Spring框架的预习和自我整理

    Spring简介 - 预习的自我整理 1. What's Spring? Spring是一个从实际开发中抽取出来的框架,完成了大量开发中的通用步骤,留给开发者仅仅是与特定应用相关的部分,从而提高了企业 ...

  5. Android中Dialog的使用

    上一篇博文讲到对话框popWindow的使用,这篇博文主要解说Dialog的使用. 1.什么是Dialog? Dialog就是对话框的一种方式! 在Android开发中.我们常常会须要在Android ...

  6. POJ 2240 Arbitrage(最短路 套汇)

    题意  给你n种币种之间的汇率关系  推断是否能形成套汇现象  即某币种多次换为其他币种再换回来结果比原来多 基础的最短路  仅仅是加号换为了乘号 #include<cstdio> #in ...

  7. UVa 11463 - Commandos

    主题:有一个敢死队,要销毁的建筑群,他们从一个特定建筑物离开,最后到一组特定的建筑物的. 现在,各个建筑物之间进行连接的路由,班车需要在建筑物1时间单位,我问的第一次集合. 分析:图论,最短路径.直接 ...

  8. unity3d 数学的数学基础和辅助类

    转载注明smartdot:http://my.oschina.net/u/243648/blog/67193 1.  数学(点乘/叉乘)/unity3d的数学辅助类 2.  坐标系统(本地/世界/屏幕 ...

  9. 新书《iOS8 Swift编程指南》货架

    颐和园的新书出版. 链接:http://www.amazon.cn/dp/B00YOQSYAO 这本书从去年开始7可能开始写.今年1完成这个月的第一稿,经过多次修改,今天,最后的正式出版,欢迎大家指正 ...

  10. 重新想象 Windows 8 Store Apps (13) - 控件之 SemanticZoom

    原文:重新想象 Windows 8 Store Apps (13) - 控件之 SemanticZoom [源码下载] 重新想象 Windows 8 Store Apps (13) - 控件之 Sem ...