最近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>