Java实现的串口通信功能示例

本文实例讲述了Java实现的串口通信功能。分享给大家供大家参考,具体如下:

用Java实现串口通信(windows系统下),需要用到sun提供的串口包 javacomm20-win32.zip。其中要用到三个文件,配置如下:

1.comm.jar放置到 JAVA_HOME/jre/lib/ext;
2.win32com.dll放置到 JAVA_HOME/bin;
3.javax.comm.properties 两个地方都要放
    jre/lib(也就是在JAVA文件夹下的jre)
   JAVA_HOME/jre/lib

说一下我应用的环境。电子秤称重时,计算机通过串口给称重控制显示器发送一次命令“R”,控制显示器则发送一次重量数据给串口,计算机再读取将数据显示在网页上。这样就构成了一个实时称重系统。

读写串口的代码如下:

package com.chengzhong.tools;
import java.io.*;
import javax.comm.CommPortIdentifier;
import javax.comm.*;
/**
*
* This bean provides some basic functions to implement full duplex
* information exchange through the serial port.
*
*/
public class SerialBean
{
public static String PortName;
public static CommPortIdentifier portId;
public static SerialPort serialPort;
public static OutputStream out;
public static InputStream in;
//保存读数结果
public static String result="";
public static int openSignal=1;
/**
*
* Constructor
*
* @param PortID the ID of the serial to be used. 1 for COM1,
* 2 for COM2, etc.
*
*/
public SerialBean(int PortID)
{
 PortName = "COM" +PortID;
}
/**
*
* This function initialize the serial port for communication. It starts a
* thread which consistently monitors the serial port. Any signal captured
* from the serial port is stored into a buffer area.
*
*/
public int Initialize()
{
  openSignal=1;
  try
  {
  portId = CommPortIdentifier.getPortIdentifier(PortName);
  try
  {
  serialPort = (SerialPort)
  portId.open("Serial_Communication", 2000);
  } catch (PortInUseException e)
  {
    if(!SerialBean.portId.getCurrentOwner().equals("Serial_Communication"))
    {
      openSignal=2; //该串口被其它程序占用
    }else if(SerialBean.portId.getCurrentOwner().equals("Serial_Communication")){
      openSignal=1;
      return openSignal;
    }
   return openSignal;
  }
  //Use InputStream in to read from the serial port, and OutputStream
  //out to write to the serial port.
  try
  {
  in = serialPort.getInputStream();
  out = serialPort.getOutputStream();
  } catch (IOException e)
  {
     openSignal=3;  //输入输出流错误
     return openSignal;
  }
  //Initialize the communication parameters to 9600, 8, 1, none.
  try
  {
  serialPort.setSerialPortParams(9600,
  SerialPort.DATABITS_8,
  SerialPort.STOPBITS_1,
  SerialPort.PARITY_NONE);
  } catch (UnsupportedCommOperationException e)
  {
     openSignal=4;  //参数不正确
     return openSignal;
  }
  } catch (NoSuchPortException e)
  {
     portId=null;
     openSignal=5; //没有该串口
     return openSignal;
  }
  // when successfully open the serial port, create a new serial buffer,
  // then create a thread that consistently accepts incoming signals from
  // the serial port. Incoming signals are stored in the serial buffer.
// return success information
return openSignal;
}
/**
*
* This function returns a string with a certain length from the incoming
* messages.
*
* @param Length The length of the string to be returned.
*
*/
public static void ReadPort()
{
  SerialBean.result="";
int c;
try {
  if(in!=null){
    while(in.available()>0)
    {
      c = in.read();
      Character d = new Character((char) c);
      SerialBean.result=SerialBean.result.concat(d.toString());
    }
  }
} catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}
}
/**
*
* This function sends a message through the serial port.
*
* @param Msg The string to be sent.
*
*/
public static void WritePort(String Msg)
{
try
{
  if(out!=null){
    for (int i = 0; i < Msg.length(); i++)
       out.write(Msg.charAt(i));
  }
} catch (IOException e) {
  return;
}
}
/**
*
* This function closes the serial port in use.
*
*/
public void ClosePort()
{
 serialPort.close();
}
}

这样通过 SerialBean.result 就可得到读数结果。

至于把数据放到网页上,就要用到Ajax了,这里用到了一个Ajax框架dwr, dwr类Put.java 如下:

package com.chengzhong.dwr;
import java.io.IOException;
import com.chengzhong.tools.Arith;
import com.chengzhong.tools.SerialBean;
public class Put {
  //2011.9.17
  public String write(){
    //发送指令R,仪器发送一次净重数据
    SerialBean.WritePort("R");
    //读取数据
    SerialBean.ReadPort();
    String temp=SerialBean.result.trim();  //我这里temp是形如 wn125.000kg 的数据
    if(!temp.equals("") && temp.length()==11)
    {
       return (change(temp)).toString();
    }else{
      return "";
    }
  }
  //响应开始称重
  public String startWeight(String num){
     int n=Integer.parseInt(num.trim());
     SerialBean SB = new SerialBean(n);
     SB.Initialize();
     return SerialBean.openSignal+""; //返回初始化信息
  }
//响应停止称重
  public void endWeight(){
    try {
      //关闭输入、输出流
      SerialBean.in.close();
      SerialBean.out.close();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    if(SerialBean.serialPort!=null){
      SerialBean.serialPort.close(); //关闭串口
    }
    SerialBean.serialPort=null;
    SerialBean.portId=null;
    SerialBean.result="";
  }
  /**
      * 将形如 wn125.000kg 格式的重量转换为 125.000 (kg)(四舍五入,小数点后保留两位)
   */
   public String change(String source){
     Double result=0.0;
     String s1=source.substring(2,9);
     try{
       result=Double.parseDouble(s1);
       result=Arith.round(result,2);
     }catch(Exception e){
       e.printStackTrace();
       return "";
     }
     return result.toString();
   }
}

注:Arith.java是一个java 的高精度计算文件。

package com.chengzhong.tools;
import java.math.BigDecimal;
/**
* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
* 确的浮点数运算,包括加减乘除和四舍五入。
*/
public class Arith{
  //默认除法运算精度
  private static final int DEF_DIV_SCALE = 10;
  //这个类不能实例化
  private Arith(){
  }
  /**
   * 提供精确的加法运算。
   * @param v1 被加数
   * @param v2 加数
   * @return 两个参数的和
   */
  public static double add(double v1,double v2){
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.add(b2).doubleValue();
  }
  /**
   * 提供精确的减法运算。
   * @param v1 被减数
   * @param v2 减数
   * @return 两个参数的差
   */
  public static double sub(double v1,double v2){
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.subtract(b2).doubleValue();
  }
  /**
   * 提供精确的乘法运算。
   * @param v1 被乘数
   * @param v2 乘数
   * @return 两个参数的积
   */
  public static double mul(double v1,double v2){
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.multiply(b2).doubleValue();
  }
  /**
   * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
   * 小数点以后10位,以后的数字四舍五入。
   * @param v1 被除数
   * @param v2 除数
   * @return 两个参数的商
   */
  public static double div(double v1,double v2){
    return div(v1,v2,DEF_DIV_SCALE);
  }
  /**
   * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
   * 定精度,以后的数字四舍五入。
   * @param v1 被除数
   * @param v2 除数
   * @param scale 表示表示需要精确到小数点以后几位。
   * @return 两个参数的商
   */
  public static double div(double v1,double v2,int scale){
    if(scale<0){
      throw new IllegalArgumentException(
        "The scale must be a positive integer or zero");
    }
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
  }
  /**
   * 提供精确的小数位四舍五入处理。
   * @param v 需要四舍五入的数字
   * @param scale 小数点后保留几位
   * @return 四舍五入后的结果
   */
  public static double round(double v,int scale){
    if(scale<0){
      throw new IllegalArgumentException(
        "The scale must be a positive integer or zero");
    }
    BigDecimal b = new BigDecimal(Double.toString(v));
    BigDecimal one = new BigDecimal("1");
    return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
  }
}

网页页面上:

<script type="text/javascript" src="/ChengZhong/dwr/engine.js"></script>
<script type="text/javascript" src="/ChengZhong/dwr/util.js"></script>
<script type='text/javascript' src='/ChengZhong/dwr/interface/ss.js' ></script>
<script type='text/javascript' >
 var ID;
   function begin(){
    ID=window.setInterval('get()',500); //每隔半秒自动调用 get(),取得毛重数据填入文本框中
   }
 function get()
   {
    ss.write(readIt);  //调用dwr类 Put.java 中的write方法
   }
   function readIt(Data){
    if(Data!=null && Data!="")
    {
      document.getElementById("mzBF").value=Data;
        }
   }
</script>

dwr的使用就不说了

更多关于java相关内容感兴趣的读者可查看本站专题:《Java Socket编程技巧总结》、《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • java 串口通信详细及简单实例

    java 实现串口通信 最近做了一个与硬件相关的项目,刚开始听说用java和硬件打交道,着实下了一大跳.java也可以操作硬件? 后来接触到是用java通过串口通信控制硬件感觉使用起来还不错,也很方便. 特拿出来和大家一起分享一下. 准备工作: 首先到SUN官网下载一个zip包:javacomm20-win32.zip 其中重要的有这几个文件: win32com.dll comm.jar javax.comm.properties 按照说明配置好环境,如下: 将win32com.dll复制到<J

  • 使用Java实现串口通信

    1.介绍 使用Java实现的串口通信程序,支持十六进制数据的发送与接收. 源码下载地址:http://download.csdn.net/detail/kong_gu_you_lan/9611343 效果图如下: 2.RXTXcomm Java串口通信依赖的jar包RXTXcomm.jar 下载地址:http://download.csdn.net/detail/kong_gu_you_lan/9611334 内含32位与64位版本 使用方法: 拷贝 RXTXcomm.jar 到 JAVA_HO

  • Java使用开源Rxtx实现串口通讯

    本文实例为大家分享了Java使用开源Rxtx实现串口通讯的具体代码,供大家参考,具体内容如下 使用方法: windows平台: 1.把rxtxParallel.dll.rxtxSerial.dll拷贝到:C:\WINDOWS\system32下. 2.如果是在开发的时候(JDK),需要把RXTXcomm.jar.rxtxParallel.dll.rxtxSerial.dll拷贝到..\jre...\lib\ext下:如:D:\Program Files\Java\jre1.6.0_02\lib\

  • java使用Rxtx实现串口通信调试工具

    本文实例为大家分享了java使用Rxtx实现串口通信调试工具的具体代码,供大家参考,具体内容如下 最终效果如下图: 1.把rxtxParallel.dll.rxtxSerial.dll拷贝到:C:\WINDOWS\system32下. 2.RXTXcomm.jar 添加到项目类库中. 代码: package serialPort; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream

  • java 串口通信实现流程示例

    1.下载64位rxtx for java 链接:http://fizzed.com/oss/rxtx-for-java 2.下载下来的包解压后按照说明放到JAVA_HOME即JAVA的安装路径下面去 3.在maven的pom.xml下添加 <dependency> <groupId>org.rxtx</groupId> <artifactId>rxtx</artifactId> <version>2.1.7</version&g

  • 基于Java编写串口通信工具

    最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar包,由于java.comm比较老了,而且不支持64位系统,这里推荐Rxtx这个jar包(32位/64位均支持). 官方下载地址:http://fizzed.com/oss/rxtx-for-java (注:可能需要FQ才能下载) 不能FQ的童鞋,可以在这里下载: http://xiazai.jb51

  • Java实现的串口通信功能示例

    本文实例讲述了Java实现的串口通信功能.分享给大家供大家参考,具体如下: 用Java实现串口通信(windows系统下),需要用到sun提供的串口包 javacomm20-win32.zip.其中要用到三个文件,配置如下: 1.comm.jar放置到 JAVA_HOME/jre/lib/ext; 2.win32com.dll放置到 JAVA_HOME/bin; 3.javax.comm.properties 两个地方都要放     jre/lib(也就是在JAVA文件夹下的jre)    JA

  • Java Socket实现多线程通信功能示例

    本文实例讲述了Java Socket实现多线程通信功能的方法.分享给大家供大家参考,具体如下: 前面的文章<Java Socket实现单线程通信的方法示例>说到怎样写一个最简单的Java Socket通信,但是文章中的例子有一个问题就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后续Client不能再继续连接,所以需要做些改动,当Server没接受到一个Client连接请求之后,都把处理流程放到一个独立的线程里去运行,然后等待下一个Client连接请求

  • 使用Java实现简单串口通信

    本博文参考自https://www.jb51.net/article/100269.htm www.jb51.net/article/100269.htm 没想到挺多人需要这个的,很高兴这篇文章能对大家有帮助,主要的工具类博文里已经有了,当然,要小工具源码的留言邮箱即可. 2019.09.05 最近接触到了串口及其读写,在此记录java进行串口读写的过程. 1.导入支持java串口通信的jar包: 在maven项目的pom.xml中添加RXTXcomm的依赖 或者 下载RXTXcomm.jar并

  • Java 实现简单Socket 通信的示例

    目录 1. 传输层协议 2. TCP 示例 2.1 示例效果 2.2 服务端程序代码 3. UDP 示例 3.1 服务端程序代码 3.2 客户端程序代码 Java socket 封装了传输层的实现细节,开发人员可以基于 socket 实现应用层.本文介绍了 Java socket 简单用法. 1. 传输层协议 传输层包含了两种协议,分别是 TCP (Transmission Control Protocol,传输控制协议) 和 UDP (User Datagram Protocol,用户数据报协

  • Python基于socket模块实现UDP通信功能示例

    本文实例讲述了Python基于socket模块实现UDP通信功能.分享给大家供大家参考,具体如下: 一 代码 1.接收端 import socket #使用IPV4协议,使用UDP协议传输数据 s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #绑定端口和端口号,空字符串表示本机任何可用IP地址 s.bind(('', 5000)) while True: data, addr=s.recvfrom(1024) #显示接收到的内容 print(

  • Java实现的百度语音识别功能示例

    本文实例讲述了Java实现的百度语音识别功能.分享给大家供大家参考,具体如下: SDK以及示例代码下载地址: http://yuyin.baidu.com/sdk 最近一直在搞java,就选择了java工程.将代码拷过去.同时复制文件"test.pcm"到工程目录下.就基本上可以了. 注:test.pcm是语音文件,可以用audacity软件打开,选择 文件->导入->裸数据. 设置采样率为8000Hz.点击播放就能听见声音了. 这个时候程序跑起来还有问题,需要将apiKe

  • Java编程调用微信分享功能示例

    本文实例讲述了Java编程调用微信分享功能.分享给大家供大家参考,具体如下: 这篇文章介绍如何使用java开发微信分享功能,因为工作,已经开发完成,可使用. 如果想要自定义微信的分享功能,首先在自己的页面内首先使用AJAX.下面我具体举例. 首先是在页面内写入请求后台的AJAX /** * 调用微信分享接口 * */ public void WXConfig(){ String url = getPara("href"); WXConfigController scan = new W

  • java实现的图片裁剪功能示例

    本文实例讲述了java实现的图片裁剪功能.分享给大家供大家参考,具体如下: PicCut.java: package Tsets; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Iterator; import javax

  • Java实现的自定义迭代器功能示例

    本文实例讲述了Java实现的自定义迭代器功能.分享给大家供大家参考,具体如下: 编写自己的Iterator,实现Iterator接口,这里多说一句,实现Iterable后,可以用"foreach"循环遍历你的对象. import java.util.Iterator; import java.util.NoSuchElementException; /** * 演示Iterator和Iterable接口,并说明怎样编写一个用于对象数组的简单迭代器. */ public class Aa

  • Android编程实现TCP、UDP客户端通信功能示例

    本文实例讲述了Android编程实现TCP.UDP客户端通信功能.分享给大家供大家参考,具体如下: 在进行Android开发的过程中,免不了,要开发TCP/UDP通讯的程序,下面这两段代码,分别介绍了TCP/UCP通过的一个实例: 代码一 TCP通讯: private void tcpdata() { try { Socket s = new Socket("192.168.0.25", 65500); // outgoing stream redirect to socket Out

随机推荐