写这篇文章是为了记录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());
}
}
}
}
- Enumeration<?> en = CommPortIdentifier.getPortIdentifiers();
- CommPortIdentifier portId;
- while (en.hasMoreElements()) {
- portId = (CommPortIdentifier) en.nextElement();
- // 如果端口类型是串口,则打印出其端口信息
- if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
- System.out.println(portId.getName());
- }
- }
<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资源下载。