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 informationreturn 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 blocke.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.17public 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 blocke.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的使用就不说了

转载于:https://www.cnblogs.com/mfrbuaa/p/4183008.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

庆祝教师节,李宁老师课程优惠劵疯抢中、会员卡优惠中,先到先得

李宁老师会员卡&#xff08;9-10至9-14&#xff09;大优惠&#xff1a;http://edu.51cto.com/member/id-12_1.html优惠劵只能购买李宁老师的视频课程&#xff1a;http://edu.51cto.com/member/id-12_1.html 优惠劵有效期&#xff1a;2015-9-10 至 2015-9-14 购买规则&#xf…

java mset_Java 反射机制(包括组成、结构、示例说明等内容)

第1部分 Java 反射机制介绍Java 反射机制。通俗来讲呢&#xff0c;就是在运行状态中&#xff0c;我们可以根据“类的部分已经的信息”来还原“类的全部的信息”。这里“类的部分已经的信息”&#xff0c;可以是“类名”或“类的对象”等信息。“类的全部信息”就是指“类的属性…

XML序列化和反序列化 以及相关类的写法

类的写法&#xff1a; 省网办数据对接中运用到 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Serialization;namespace SWBExchange.Common.Entities {public class Body{[XmlElement(ElementName "BasicIn…

python-main

当你打开一个.py文件时,经常会在代码的最下面看到if __name__ __main__:,现在就来介 绍一下它的作用.模块是对象&#xff0c;并且所有的模块都有一个内置属性 __name__。一个模块的 __name__ 的值取决于您如何应用模块。如果 import 一个模块&#xff0c;那么模块__name__ 的值…

自己动手,实现一种类似ListT的数据结构(二)

前言&#xff1a; 首先&#xff0c;小匹夫要祝各位看官圣诞快乐&#xff0c;新年愉快&#xff5e;。上一篇文章《自己动手&#xff0c;实现一种类似List<T>的数据结构(一&#xff09;》 介绍了一下不依靠List<T>实现的各种接口&#xff0c;仿造一个轻量级数据结构的…

java spring jdbc_Spring与JDBC支持

JDBC是一种标准Java编程接口(JAVA API)&#xff0c;可以将Java编程语言与广泛数据库进行连接。JDBC API库包含下面提到的每个任务&#xff0c;都是与数据库相关的常用用法。数据库的连接创建sql语句执行或提交sql语句查看或修改查询到的记录从根本上说&#xff0c;JDBC是一种规…

局域网内连接MySQL

2019独角兽企业重金招聘Python工程师标准>>> 局域网内连接MySQL 博客分类&#xff1a; MySQL MySQL局域网连接grant 我们都知道连接MySQL一般用的语句就是 jdbc:mysql://localhost:3306/database&#xff0c; 但是当你要连接到其他机器上的mysql的时候&#xff0c;…

java打印的globa类l_Spring异常集中处理和日志集中打印

使用ControllerAdvice和ExceptionHandler处理Controller层的异常&#xff1a;ControllerAdvicepublic class GlobalExceptionHandler {private static final Logger LOGGER LoggerFactory.getLogger(GlobalExceptionHandler.class);/*** 处理所有不可知的异常* param e* retur…

[leetcod] Clone Graph

题目&#xff1a; Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJs undirected graph serialization: Nodes are labeled uniquely. We use # as a separator for each node, and , as a separator for node label and …

【iOS7一些总结】9、与列表显示(在):列表显示UITableView

列表显示&#xff0c;顾名思义它是在一个列表视图的形式显示在屏幕上的数据的内容。于ios在列表视图UITableView达到。这个类在实际应用中频繁&#xff0c;是很easy理解。这里将UITableView的主要使用方法总结一下以备查。UITableView定义在头文件UITableView.h中&#xff0c;详…

java聊天软件课程设计_[计算机课程设计] JAVA课程设计-聊天室

本系统基于C/S模式。新的时代,新的世纪,在当今这个发达的信息时代,网上办公,极为普遍,生活变的简单化,人们在家就可以办公,是信息化时代的标志.我经过多方的调查和研究,并灵活运用了自己所学的知识,编写了这个非常适用的一个小软件.它是通过RMI通信协议,利用JAVA的多线程技术,将…

iOS 获取手机信息

待续&#xff1b;转载于:https://www.cnblogs.com/xieyier/p/4194271.html

show status和show variables区别解析

1.show status 查看系统运行的实时状态&#xff0c;便于dba查看mysql当前运行的状态&#xff0c;做出相应优化&#xff0c;动态的&#xff0c;不可认为修改&#xff0c;只能系统自动update。MariaDB [(none)]> show status like %conn%;--------------------------------…

【Javascript 拾遗之三】Closure 闭包

说起闭包这个概念&#xff0c;其实是离散数学中的一种定义&#xff0c;而很程序员们耳熟能详但不一定能说清楚它的含义和用途。本文先简单地介绍下离散数学中的闭包&#xff0c;然后再探讨一下Javascript语言中的闭包是如何创建和应用的。 Closure 闭包 1、闭包的定义 -离散数学…

java递归空瓶换饮料_问题描述:一次买n瓶可乐,k个空瓶可以换一瓶饮料,那么一共能喝多少瓶饮料? | 学步园...

/***问题描述&#xff1a;一次买n瓶可乐&#xff0c;k个空瓶可以换一瓶饮料&#xff0c;那么一共能喝多少瓶饮料&#xff1f;*下面用不同的方法实现了这个问题(Java实现)&#xff1a;*1.递归方法*2.非递归方法*3.公式法*/public class CocaCola{public int Count(int n, int k)…

SpringMVC(一):环境搭建

2019独角兽企业重金招聘Python工程师标准>>> //TODO 转载于:https://my.oschina.net/u/1020238/blog/505272

DockPanel 类

DockPanel 类 .NET Framework 4.5其他版本此主题尚未评级 - 评价此主题定义您可水平或垂直排列子元素的区域&#xff0c;互相。 继承层次结构 System.Object System.Windows.Threading.DispatcherObjectSystem.Windows.DependencyObjectSystem.Windows.Media.VisualSystem.Wind…

java动态json入库_从JSon File动态生成模式

一些兴趣点&#xff1a;1)您不需要数据帧来加载您的json架构 . 模式在驱动程序上加载和执行&#xff0c;因为不需要分发那些不必要的开销2)我构造了一个JColumn对象的List&#xff0c;并将它传递给StructType以动态构造模式3)inferSchema应该是false&#xff0c;因为我们明确定…

【分布式计算】MapReduce的替代者-Parameter Server

原文&#xff1a;http://blog.csdn.net/buptgshengod/article/details/46819051 首先还是要声明一下&#xff0c;这个文章是我在入职阿里云1个月以来&#xff0c;对于分布式计算的一点肤浅的认识&#xff0c;可能有些地方不够妥善&#xff0c;还请看官可以指出不足的地方&#…

java迭代器逆序_迭代器

提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不需要暴露该对象的内部表示。迭代器模式(Iterator)实际上在Java的集合类中已经广泛使用了。我们以List为例&#xff0c;要遍历ArrayList&#xff0c;即使我们知道它的内部存储了一个Object[]数组&#xff0c;也不…