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

来源:互联网 发布:手机振动器软件 编辑:程序博客网 时间:2024/05/29 20:01

 首先要把环境搭建好,也就是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);} /** * 数据接收的监听处理函数 */@Overridepublic 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) {}}} @Overridepublic 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在左上角


0 0
原创粉丝点击