HTMLJS浏览器与串⼝通信(⼀)
在⼀些应⽤场景中,Web应⽤程序需要获取访问者电脑上连接的硬件设备,即浏览器和串⼝通信。通常的做法是为这些硬件设备开发ActiveX控件,并将其嵌⼊到HTML⽹页中供InternetExplorer浏览器访问这些设备信息。⽽采⽤ActiveX控件要求浏览器必须为InternetExplorer,不兼容Chrome等其他浏览器。下⾯是结合⼴⼤⽹友资料的总结,顺便记录下实现的过程和碰到的问题。
⼀、使⽤使⽤串⼝资源
该⽅法是使⽤微软的ActiveX控件的串⼝控件对串⼝进⾏控制,但是ActiveX控件⽬前只针对IE浏览器⽀持较好,要想兼容其他浏览器可以去下⾃定义ActiveX控件相关资料
⼆、⽤C#之类的⾃⼰写⼀个dll,然后使⽤
使⽤C#语⾔的控件对串⼝进⾏控制,然后使⽤JS+AJAX与C#进⾏交互获得串⼝数据,缺点就是数据同步⽅⾯可能相对稍有延迟,毕竟AJAX是⼀个异步传输的标准
三、⽤Node.js 的serial模块实现
四、使⽤Google的Chrome.serial实现
下⾯我详细说⼀下⽤微软的ActiveX控件实现串⼝通信的过程
1.注册MSCOMM3
<控件
2.设置注册表
A. 复制下⾯的内容,⽂件命名为mscomm.bat
copy mscomm*.* %windir%\system32\ /y
Regsvr32 %windir%\ /s
Regsvr32 %windir%\system32\actxprxy.dll /s
Regsvr32 %windir%\system32\shdocvw.dll /s
Reg add"HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905" /v “” /d “kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun” /f
pause
B.将⽂件复制到C:\Windows\SysWOW64 ⽬录下
C.右击mscomm.bat ⽂件选择以管理员⾝份运⾏
D.出现如图:即操作成功,完成后即可关闭命令窗⼝
3.设置IE对ActiveX的安全控制
A.打开IE浏览器 — 设置 — Internet 选项 — 安全模块 — ⾃定义级别
B.⾃定义级别——安全——ActiveX控件和插件
C.如下图操作:
⽅点击确定,是,重启浏览器。
4.IE 管理项加载
A.新建⽂档,复制下⾯的内容,⽂件为mscomm.html
<html>
<head>
<title></title>
</head>
浏览器的activex控件<body>
<OBJECT id=MSComm1 CLASSID="clsid:648A5600-2C6E-101B-82B6-000000000014" codebase="MSCOMM32.OCX" type="application/x-oleobject" styl e="LEFT:54px;TOP:14px">
<PARAM  NAME="CommPort"  VALUE="3"/>
<PARAM  NAME="DataBits"  VALUE="8"/>
<PARAM  NAME="StopBits"  VALUE="1"/>
<PARAM  NAME="BaudRate"  VALUE="9600"/>
<PARAM  NAME="Settings"  VALUE="9600,N,8,1"/>
<PARAM  NAME="RTSEnable"  VALUE="1"/>
<PARAM  NAME="DTREnable"  VALUE="1"/>
<PARAM  NAME="Handshaking"  VALUE="0"/>
<PARAM  NAME="NullDiscard"  VALUE="0"/>
<PARAM  NAME="ParityReplace"  VALUE="?"/>
<PARAM  NAME="EOFEnable"  VALUE="0"/>
<PARAM  NAME="InputMode"  VALUE="0"/>
<PARAM  NAME="InBufferSize"  VALUE="1024"/>
<PARAM  NAME="InputLen"  VALUE="0"/>
<PARAM  NAME="OutBufferSize"  VALUE="512"/>
<PARAM  NAME="SThreshold"  VALUE="0"/>
<PARAM  NAME="RThreshold"  VALUE="1"/>
</OBJECT>
</body>
</html>
B.在IE中运⾏mscomm.html
C.查看控件是否加载 设置——管理加载项——所有加载项
3.附上代码
<!DOCTYPE html>
<html>
<head>
<title>JavaScript串⼝测试</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  <script ID=clientEventHandlersJS LANGUAGE=javascript>
<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;
} catch(ex) {
ssage);
}
} else {
try {
MSComm1.PortOpen = true;
} catch(ex) {
ssage);
}
}
}
function ConfigPort() {
alert("串⼝状态:" + MSComm1.PortOpen);
if(MSComm1.PortOpen == false) {
try {
MSComm1.CommPort = ElementById("ComName").value;
alert(MSComm1.CommPort)
MSComm1.Settings = ElementById("BaudRate").String() + "," +      ElementById("CheckBit").String() + "," +
MSComm1.OutBufferCount = 0; //清空发送缓冲区
MSComm1.InBufferCount = 0; //滑空接收缓冲区
alert("已配置串⼝COM" + MSComm1.CommPort + "\n 参数:" + MSComm1.Settings);    } catch(ex) {
ssage);
}
} else {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。