最近JavaScript读取串口数据。挺麻烦了,找了不少资料。总算成功了。走了不少弯路。现在做个总结。
1.注册mscomm32.ocx。网上很多,不在一一叙述。
2.这步弄了我好几天。就是注册了mscomm32.ocx。即使你代码没有问题,你也获取不到串口数据。因为 windows 安全补丁KB973346,删除它,再测
试,程序正常。windows 安全补丁KB973346最好不要删除,删除这个补丁时提示对其他几个补丁有影响。找到了注册表关键位置
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{648A5600-2C6E-101B-82B6-000000000014}]
Compatibility Flags = 0×400 。
这是补丁程序对有漏洞的 ActiveX 控件设置的标志,让 IE 不加载它。删除这个键,再看 IE 的管理加载项,里面出现了 MSCOMM 控件的名字
Microsoft Communication Control ,进一步测试程序,控件加载正常。看来这才是解决问题的最好办法。于是写了一个删除注册表键的 reg 文件:
Windows Registry Editor Version 5.00
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{648A5600-2C6E-101B-82B6-000000000014}]
双击这个 reg 文件,提示导入注册表成功后,相应键值被成功删除,问题搞定。
3.编写读取写入程序。我的当初的代码如下。
<pre lang=”JavaScript”>
<HTML>
<HEAD>
<TITLE></TITLE>
<SCRIPT LANGUAGE=”JavaScript”>
function OpenPort(){
if (!MSComm1.PortOpen){
MSComm1.PortOpen = true;
}else{
alert(“Port already opened !”);
}
}
function ClosePort(){
if (MSComm1.PortOpen){
MSComm1.PortOpen = false;
}else{
alert(“Port already closed !”);
}
}
//把十进制数换成相应的16进制转
function d2x(x)
{
var temp = 0;
var ftable = new Array(“0″,”1″,”2″,”3″,”4″,”5″,”6″,”7″,”8″,”9″,”A”,”B”,”C”,”D”,”E”,”F”);
x = x.split(” “);
for (var i = 0; i < x.length; i++)
{
temp = parseInt(x[i]);
x[i] = ftable[Math.floor(temp / 16)] + ftable[temp % 16];
}
return x.join(” “);
}
function d2xs(x)
{
var temp = 0;
var ftable = new Array(“0″,”1″,”2″,”3″,”4″,”5″,”6″,”7″,”8″,”9″,”A”,”B”,”C”,”D”,”E”,”F”);
temp = parseInt(x);
x = ftable[Math.floor(temp / 16)] + ftable[temp % 16];
return x;
}
//接收用,字符串转成十六进制展示
function string2x(str)
{
var temp = “”;
//str = str.split(” “);
for(var i = 0; i < str.length; i++)
{
if (isAsc(str.charAt(i)))
{
temp += d2xs(str.charCodeAt(i)) + ” “;
}else{
temp += esca(str.charAt(i)) + ” “;
}
}
//alert(temp);
temp = temp.slice(0,-1);
//temp = d2x(temp);
return temp;
}
function isAsc(str)
{
var reg = /[\x00-\x7F]/g;
return (str.match(reg) != null);
}
function esca(cha)
{
var c = escape(cha);
c = c.replace(“%u”,”");
c = c.charAt(2) + c.charAt(3) + ” ” + c.charAt(0) + c.charAt(1);
return c;
}
function Send(){
//var v = eval(“0x” + frmView.txtWeight.value) + “”;
var v = frmView.txtWeight.value;
//alert(eval(“0x” + frmView.txtWeight.value) + “”)
MSComm1.Output = unescape(v);
//alert(“设置了发送资料:” + v);
//alert(MSComm1.RThreshold);
}
var data = {
//计算穴位 0×59 0×58 0×01 0×02 时间(7B) SUM
//时间 7B \x02\x00\x00\x07\x09\x06\x09\x45
//返回穴位 0×41 0×42 穴位号(1B,范围=0-59) SUM 如 %
cp:”%59%58%01%02″,
rp:”%u4241″,
//开始治疗 0×59 0×58 0×03 0×04 强度(1B,范围=1-9) 时间(1B,单位=分钟) SUM
startMsg:”%59%58%03%04″,
startStrength:new Array(“%01″,”%02″,”%03″,”%04″,”%05″,”%06″,”%07″,”%08″,”%09″),
//startTime:
//终止治疗 0×59 0×58 0×05 0×06
endMsg:”\x59\x58\x05\x06″,
//查询状态 0×59 0×58 0×07 0×08
check:”\x59\x58\x07\x08″,
checkInfoBegin:”%u4241″,//状态号(1B) SUM 如:%u0001
dateGet:function (y,m,d,h){
y = “%0″ + y.charAt(0) + “%0″ + y.charAt(1) + “%0″ + y.charAt(2) + “%0″ + y.charAt(3);
m = “%” + (m.length == 1)?”0″ + m:m;
d = “%” + (d.length == 1)?”0″ + d:d;
h = “%” + (h.length == 1)?”0″ + h:h;
return y+m+d+h
},
sumList:function (str){
str = str.split(“%”);
var sum = 0;
for (var i=1; i < str.length; i++)
{
sum += parseInt(str[i]);
}
return “%” + d2xs(sum % 100) + “” + d2xs(Match.floor(sum / 100));
}
}
function MSComm1_OnComm(vv) {
var fldWeight = frmView.txtWeight ;
var strInput = fldWeight.value;
switch (MSComm1.CommEvent)
{
case 1:
break;
case 2:
strInput = MSComm1.Input;
if (strInput == “”) {return false;}
te.value = strInput;
if (te.va != “”){
te.v = te.value;
}else{
te.value = te.v;
}
vv(string2x(te.value));
fldWeight.focus();
break;
}
}
function a(v){alert(v);}
</SCRIPT>
<SCRIPT LANGUAGE=javascript FOR=MSComm1 EVENT=OnComm>
<!–
MSComm1_OnComm(a);
//–>
</SCRIPT>
</HEAD>
<BODY>
<input type=”text” style=”display:none” id=”te” >
<OBJECT CLASSID=”clsid:648A5600-2C6E-101B-82B6-000000000014″
id=MSComm1 codebase=”MSCOMM32.OCX” type=”application/x-oleobject”
style=”display:none” >
<PARAM NAME=”_ExtentX” VALUE=”1005″>
<PARAM NAME=”_ExtentY” VALUE=”1005″>
<PARAM NAME=”_Version” VALUE=”393216″>
<PARAM NAME=”CommPort” VALUE=”1″>
<PARAM NAME=”DTREnable” VALUE=”-1″>
<PARAM NAME=”Handshaking” VALUE=”0″>
<PARAM NAME=”InBufferSize” VALUE=”1024″>
<PARAM NAME=”InputLen” VALUE=”0″>
<PARAM NAME=”NullDiscard” VALUE=”0″>
<PARAM NAME=”OutBufferSize” VALUE=”512″>
<PARAM NAME=”ParityReplace” VALUE=”63″>
<PARAM NAME=”RThreshold” VALUE=”4″>
<PARAM NAME=”RTSEnable” VALUE=”0″>
<PARAM NAME=”BaudRate” VALUE=”2400″>
<PARAM NAME=”ParitySetting” VALUE=”0″>
<PARAM NAME=”DataBits” VALUE=”7″>
<PARAM NAME=”StopBits” VALUE=”0″>
<PARAM NAME=”SThreshold” VALUE=”0″>
<PARAM NAME=”EOFEnable” VALUE=”-1″>
<PARAM NAME=”Settings” VALUE=”2400,N,8,1″>
<PARAM NAME=”InputMode” VALUE=”1″></OBJECT>
<FORM action=”" method=post id=frmView name=frmView>
<P>
<INPUT id=txtWeight name=txtWeight style=”LEFT: 50px; TOP: 17px”></P>
<P> </P>
<P>
<BUTTON OnClick=”OpenPort()” value=”Open Port”>Open COM Port</BUTTON>
<BUTTON onclick=”ClosePort()” value=”Close Port”>Close COM Port</BUTTON>
<BUTTON onclick=”Send()” value=”Close Port”>Send Some Data</BUTTON>
</P>
<P>
</P>
</FORM>
</BODY>
</HTML>
</pre>
/img/logo.jpg)