java RS232串口通讯(电子天平数据抓取)

写这篇文章是为了记录RS232串口通讯,当时有个央企项目里需要实现自动抓取RS232串口数据,需要支持主要浏览器:Chrome,Firefox,IE8以上等。看了很多有关rs232的资料和也找了很多方法,终于找到了解决方案,实现了此功能很是开心。现在分享下给朋友们...

在此方法解决参阅几篇文章,感谢你们留下的解决思路。

http://elkan1788.iteye.com/blog/1463049

http://wenku.baidu.com/link?url=dC91PCN5bezV_NyXxKfH7SojfUqs3aNeulUinI0eyu2hVWIXr8kf07BQg7AQ8gK-W4RhfnBg3JSYUKAxP68wigp6MgZ5L60CbHxA-gCYiu_

http://blog.csdn.net/luoduyu/article/details/2182321

http://blog.csdn.net/ssrc0604hx/article/details/7979868

1.准备USB-RS232串口线(从京东上购买),在搜索RS232

2.装USB虚拟驱动PL232

USB-Serial Controller D驱动(通过驱动精灵安装后重启生效)检查下是否安装成功在设备和打印机区域查看或至管理,在计算机-》管理-》设备管理器-》设备驱动会显示PL232驱动,没有黄色感叹号,说明驱动已经成功

3.安装个vspd虚拟串口软件,增加一对COM口

4.测试COM口是否开通。

第一安装jar包
我本机是win64的安装的是RXTXjar包,下载地址是http://fizzed.com/oss/rxtx-for-java
Copy RXTXcomm.jar ---> <JAVA_HOME>\jre\lib\ext
Copy rxtxSerial.dll ---> <JAVA_HOME>\jre\bin
Copy rxtxParallel.dll ---> <JAVA_HOME>\jre\bin

若是win32的安装
从sun网站下载对应操作系统的java-Communication API包
win32com.dll复制到<JDK>\bin目录下;
将comm.jar复制到 <JDK>\lib;
把javax.comm.properties也同样拷贝到<JDK>\lib目录下

第二、启动测试端口程式JAVARS232 Preferences->java->Installed JREs->Edit-->ADD External JARS引入RXTXcomm.JAR

new main 方法,测试:

import gnu.io.CommPortIdentifier;

import java.util.Enumeration;


public class Test {
  
    public static void main(String[] args) throws InterruptedException { 
        Enumeration<?> en = CommPortIdentifier.getPortIdentifiers(); 
        CommPortIdentifier portId; 
        while (en.hasMoreElements()) { 
            portId = (CommPortIdentifier) en.nextElement(); 
            // 如果端口类型是串口,则打印出其端口信息 
            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { 
                System.out.println(portId.getName()); 
            } 
        } 
    }
}

  1. Enumeration<?> en = CommPortIdentifier.getPortIdentifiers();  
  2. CommPortIdentifier portId;  
  3. while (en.hasMoreElements()) {  
  4.     portId = (CommPortIdentifier) en.nextElement();  
  5.     // 如果端口类型是串口,则打印出其端口信息  
  6.     if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {  
  7.         System.out.println(portId.getName());  
  8.     }  

运行代码后,控制台有输出正确的端口(如下图),说明所有环境正常可进行下步工作,否则请检查。

5.JS测试rs232.htm
<HTML>
<HEAD>
<title>JavaScript串口测试</title>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />
<SCRIPT   ID=clientEventHandlersJS   LANGUAGE=javascript> 
<!--   
  function   MSComm1_OnComm()   
  {      
      switch(MSComm1.CommEvent)
     {
       case 1:{ window.alert("Send OK!"); break;}  //发送事件
       case 2: { Receive();break;} //接收事件
       default: alert("Event Raised!"+MSComm1.CommEvent);;
      }       
 } 
//--> 
</SCRIPT>


<SCRIPT   LANGUAGE=javascript   FOR=MSComm1   EVENT=OnComm> 
<!--
// MSComm1控件每遇到 OnComm 事件就调用 MSComm1_OnComm()函数
     MSComm1_OnComm();
//--> 
</SCRIPT> 


<script   language="JavaScript"   type="text/JavaScript"> 
<!-- 
    String.prototype.Blength = function()
{  
    var arr = this.match(/[^\x00-\xff]/ig);  
    return  arr == null ? this.length : this.length + arr.length;  
    }  


  function OperatePort()
  {
     if(MSComm1.PortOpen==true)
    {
      try
 {
   MSComm1.PortOpen=false;
        document.getElementById("OperateButton").value="打开串口";
      }
 catch(ex)
      {
 alert(ex.message);
 }       
    }
    else
{
     try

MSComm1.PortOpen=true;
        document.getElementById("OperateButton").value="关闭串口";
     }
catch(ex)
     {
alert(ex.message);
}     
    }
 }


 function ConfigPort()
 {
   if(MSComm1.PortOpen==false)
   {   
    try
{
      MSComm1.CommPort=document.getElementById("ComName").value;
      MSComm1.Settings=document.getElementById("BaudRate").value.toString()+
                        ","+document.getElementById("CheckBit").value.toString()+
                        ","+document.getElementById("DataBits").value.toString()+
                        ","+document.getElementById("StopBits").value.toString();   
       MSComm1.OutBufferCount =0;           //清空发送缓冲区
       MSComm1.InBufferCount = 0;           //滑空接收缓冲区                         
       alert("已配置串口COM"+MSComm1.CommPort+"\n 参数:"+MSComm1.Settings);       
     }
catch(ex)
{
alert(ex.message);
}
   }
  else
   { 
 alert("请先关闭串口后再设置!");
   }
 }


 function Send()
 {
    //alert(document.getElementById("txtSend").value);
    var orgstr=document.getElementById("txtSend").value;     
    var newstr="";
    var hexflag=document.getElementById("isSendHex").checked;
     if(hexflag&&orgstr!="")
    {
      if(orgstr.substr(0,2)=="0x"||orgstr.substr(0,2)=="0X")
 {
 orgstr=orgstr.substring(2,orgstr.length);
 }
      if(orgstr.length%2!=0)
 {
 orgstr="0"+orgstr;
 }
      if((newstr=str2hex(orgstr,16))=="")
 {
 alert("错误的16进制数");return false;
 }
    }
     try
{
       MSComm1.Output=hexflag?newstr:orgstr;      
     }
catch(ex)     
     {
alert(ex.message);
}
 }
function Receive()
{   
//alert(MSComm1.Input)
   document.getElementById("txtReceive").value += MSComm1.Input;   
}
 
function ClearReceived()
 {
    document.getElementById("txtReceive").innerText="";
 } 
--> 
</script>   


</head> 
<body>
<form name="form1">     
<fieldset style="width:200px;height:250px;text-align:center;">
   <legend>配置串口</legend>
   <div style="float:left;width:200px">   
   <br/>   
   <span>串口号:</span>
   <select name="ComName" id="ComName" style="width:75px" >
   <option value="1"  >COM1</option>
   <option value="2"  >COM2</option>
   <option value="3" selected >COM3</option>
   <option value="4"  >COM4</option>   
   </select>   
   <br/>   
   <span>波特率:</span>
   <select name="BaudRate" id="BaudRate" style="width:75px" >
   <option value="9600" selected  >9600</option>
   <option value="57600"  >57600</option>
   <option value="115200" >115200</option>   
   </select>   
   <br/>
 
   <span>校验位:</span>
   <select name="CheckBit" id="CheckBit" style="width:75px" >
   <option value="N" selected  >无NONE</option>
   <option value="O"  >奇ODD</option>
   <option value="E" >偶EVEN</option>   
   </select>   
   <br/>   
  
   <span>数据位:</span>
   <input type=text id="DataBits" name="DataBits" value=8 style="width:75px;height:20px">
   <br/>
 
   <span>停止位:</span>
   <input type=text id="StopBits" name="StopBits" value=1 style="width:75px;height:20px">
   <br/>
   <br/>
   <input   type="button" id="ConfigButton" style="width:80px;height:30px;font-size:13px"   name="ConfigButton"   value="配置串口"   onClick="ConfigPort()">       
   <input   type="button" id="OperateButton" style="width:80px;height:30px;font-size:13px"   name="OperateButton"   value="打开串口"   onClick="OperatePort()">       
   </div> 
</fieldset>


<fieldset style="width:200px;height:250px;text-align:center;">
   <legend>发送区域</legend>
   <div style="float:left;">
   <textarea id="txtSend"  name="txtSend" style="width:200px;height:160px"></textarea> 
   <br/>
   <span><input id="isSendHex" name="isSendHex" type="checkbox" checked="0" />16进制</span>
   <input   type="button" id="SendButton" style="width:100px;height:30px"   name="SendButton"   value="发送"   onClick="Send()">   
   </div> 
</fieldset>


<fieldset style="width:200px;height:250px;text-align:center;">
   <legend>接收区域</legend>   
   <div style="float:left;">
   <textarea id="txtReceive" READONLY=TRUE  name="txtReceive" style="width:200px;height:160px"></textarea>  
   <br/>
   <span><input id="isReceiveHex" name="isReceiveHex" type="checkbox" />16进制</span>
   <input  type="button" id="ClearButton" style="width:100px;height:30px"   name="ClearButton"   value="清空"   onClick="ClearReceived()">
   </div>
</fieldset>   
</form> 
HKEY_CLASSES_ROOT\CLSID\{06F15699-BE3F-4486-A676-AC25857131BD}
<OBJECT ID="MSComm1" WIDTH=100 HEIGHT=51 type="application/x-oleobject"
 CLASSID="CLSID:06F15699-BE3F-4486-A676-AC25857131BD"
 CODEBASE="SComm32x.ocx">
    <PARAM NAME="_ExtentX" VALUE="2646">
    <PARAM NAME="_ExtentY" VALUE="1323">
    <PARAM NAME="_Version" VALUE="393216">
    <PARAM NAME="DTREnable" VALUE="-1">
    <PARAM NAME="RThreshold" VALUE="1">
    <PARAM NAME="RTSEnable" VALUE="-1">
</OBJECT>
</BODY>
</HTML>

在此之前先安装SCOMM32X.OCX控件

通过win+r,在运行输入regedit.exe,打开的注册表的 HKEY_CLASSES_ROOT\CLSID\下的值安装的ocx的CLASSID,不知道CLASSID可以通过HKEY_CLASSES_ROOT\CLSID\右键属性->查询Scomm32.ocx会显示在注册表

6.在页面设置好仪器设备对应的波特率串口号: 波特率: 校验位: 数据位:停止位,这个很重要,不知道的可以根据仪器设备型号的查阅此设备的说明文档。厂商一般都会提供。

7.最后收工啦,测试下接收和发送的数据是否OK。

备注:我的csdn上有RS232资源下载。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值