Java利用串口编程技术操作继电器

首先要把环境搭建好,也就是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 service工程
建议用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;
}
}
}

我这个是再加了一个播放视频的

 说的很简单,要是有不懂的,我会的,可以来和我探讨哦,QQ在左上角

Java利用串口编程技术操作继电器

时间: 2024-10-11 09:49:48

Java利用串口编程技术操作继电器的相关文章

Java串口编程

最近由于项目的需要,需要用到java串口和windows端java程序的通讯,笔者也是刚刚接触串口这一模块,在网上搜索了很多的串口编程实例之类的,几乎前篇一律吧,但是串口通讯之前的配置是非常重要的,如果配置没有成功,编程也显得没有意义.串口编程主要有两种接口,第一种是利用sun提供的comm.jar包,这种方式比较古老了,这个包也没有更新.第二种就是RXTX模式,这种模式其实和comm.jar包的模式几乎是一样的.下面就记下我学习和使用此模块的记录.RXTX资源包,网上有很多,但要注意的是看你的

java基础学习总结——利用IDE编程

  IDE:Integrated Develop Environment,集成开发环境.利用IDE编程的好处不用多说,节省大量的时间和精力. 现在总结一下利用IDE编写一个HelloWorld的具体流程.首先是建立一个项目,得有一个项目名. 具体就是:File->New->Java Project 接下来是建立一个包:在刚刚建立的java project上面右键:File->New->Package,这里面的包的具体作用是用来区分模块的,因为以后项目大了之后会涉及到很多的文件,如果

利用JSP编程技术实现一个简单的购物车程序

实验二   JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP中数据库编程方法: 二.实验要求 : 利用JSP编程技术实现一个简单的购物车程序,具体要求如下. (1)用JSP编写一个登录页面,登录信息中有用户名和密码,分别用两个按钮来提交和重置登录信息. (2)编写一个JSP程序来处理用户提交的登录信息,如果用户名为本小组成员的名字且密码为对应的学号时,采用J

关于java中面向对象编程的一点点小感悟!!!

断断续续接触java已经有半年的时间,当然中间也有过很多事情,不得已而中断了java的学习.当初刚刚接触到java的时候,总是不能理解java的面向对象编程优点.平常生活中我们做事情的思维方式都是面向过程的,就拿最简单的我要上一个培训班来说: 第一步:当然得是网上.贴吧.朋友的口中来了解这个辅导班,以此来决定是否需要上这个辅导班. 第二步:当然就是当了解完成之后,对这个辅导班比较满意.自己就需要做准备来达到辅导班的要求,比如说学费.复习知识,准备参加辅导班规定的考试. 第三步:当然就是付诸实践,

Java - TCP网络编程

Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回用户的socket 利用多线程对用户socket进行IO操作 注意:对Scoket/File进行创建.关闭,都需要放try catch中,检测 IOException,所以将网络IO部分整体放入try catch中即可. 1. 字符串操作 输出:PrintWriter out=new PrintWr

java 利用spring JavaMailSenderImpl发送邮件,支持普通文本、附件、html、velocity模板

java 利用spring JavaMailSenderImpl发送邮件,支持普通文本.附件.html.velocity模板 博客分类: Java Spring 本文主要介绍利用JavaMailSenderImpl发送邮件.首先介绍了发送一般邮件,然后介绍了发送富文本(html)邮件及以velocity为模板发送邮件. 邮件发送分为为三步:创建邮件发送器.编写邮件.发送邮件. Spring的JavaMailSenderImpl提供了强大的邮件发送功能,可发送普通文本邮件.带附件邮件.html格式

Java面向对象的编程

类的多态性: Java语言中含有方法重载与成员覆盖两种形式的多态:(区别于c++) 方法重载:在一个类中,允许多个方法使用同一个名字,但方法的参数不同,完成的功能也不同. 成员覆盖:子类与父类允许具有相同的变量名称,但数据类型不同,允许具有相同的方法名称,但完成的功能不同. 类:class 对象:object   实例:Instance 创建属于某类的对象,需要通过下面两个步骤来实现: 1.  声明指向"由类所创建的对象"的变量 2.  利用new创建新的对象,并指派给先前所创建的变量

linux串口编程参数配置详解

1.linux串口编程需要的头文件 #include <stdio.h>         //标准输入输出定义 #include <stdlib.h>        //标准函数库定义 #include <unistd.h>       //Unix标准函数定义 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>          //文件控制定义 #incl

JAVA的面向对象编程--------课堂笔记

JAVA的面向对象编程--------课堂笔记 面向对象主要针对面向过程. 面向过程的基本单元是函数.   什么是对象:EVERYTHING IS OBJECT(万物皆对象)   所有的事物都有两个方面: 有什么(属性):用来描述对象. 能够做什么(方法):告诉外界对象有那些功能. 后者以前者为基础. 大的对象的属性也可以是一个对象.   为什么要使用面向对象: 首先,面向对象符合人类看待事物的一般规律. 对象的方法的实现细节是屏蔽的,只有对象方法的实现者了解细节. 方法的定义非常重要.方法有参