js获取电子称数据MScomm

  • Post author:
  • Post category:其他




MSComm简单了解

MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。仅限ie浏览器。



话不多说上代码

window.onload = function() {
				ConfigPort() //页面加载进来函数
			}
			var res='' //做标识 保存端口用
			var com = 1;
			function ConfigPort(){
				MSComm1 = new ActiveXObject("MSCOMMLib.MSComm");//新建MScomm对象
				MSComm1.OutBufferCount =0; //清空发送缓冲区
				MSComm1.InBufferCount = 0; //滑空接收缓冲区
				MSComm1.RThreshold=8;//触发一次oncomm函数发送多少字节和用的电子称有关,和后面解析数据有关
				if(com > 6){ // 循环到端口6 如果找不到就提示
					 com = 0;
					 alert("未连接称重仪!")
					 return;
				}
				if(localStorage.getItem("CommPort")){//判断是否存在找到的端口
					MSComm1.CommPort = localStorage.getItem("CommPort");
				}else{
					MSComm1.CommPort = com; // 设置串口 
					com =com+ 1;
					timer = setTimeout('ConfigPort()',1000) //定时循环该函数
				}
				
				searchAndOpenPort()
  		 }
        function searchAndOpenPort(){
              if(MSComm1.PortOpen == true){
                toggglePort(); // 关闭或者打开端口
              }
              var b = toggglePort(); // 打开串口 并返回打开结果
        }
		function toggglePort(){
              if(MSComm1.PortOpen == false){
                try {
			      MSComm1.PortOpen = true; // 开启串口
					   bindEvent()
                  return true;
                }catch(ex){
			      setTimeout('toggglePort()',50)
						return false;
                }
              }else{
                try {
                  MSComm1.PortOpen = false; // 关闭串口
                  return true;
                }catch(ex){
						// alert('!'+ex)
                  return false;
                }
              }
            }
		var bindEvent = function () {
					function MSComm1::OnComm(){
					MSComm1_OnComm(); // 触发收发事件后的处理方法
				  }
		}

     function   MSComm1_OnComm()   {
       switch(MSComm1.CommEvent)
       {
         case 1:{ window.alert("Send OK"); break;}
         case 2: { Receive();break;} 
         default:console.log("commEvent--->default") ;
       }       
  }  
  
   function Receive()
   {   
	
	if(timer){
		clearTimeout(timer)
	}
	var value=MSComm1.Input;
    res =  "MSComm1";
	 try{
	 document.getElementById("weight_").innerHTML=realData(value+"");
	 $("#weight_1").text(realData(value+""))
	 $("#divP").text(realData(value+""))
	 }catch(e){
	 }
   }
  
	//具体 的解析函数
   function realData(inputData){
		var res1="";
		var starDot=false;
		for(var i=inputData.length-1;i>=1;i--){
		
		if(inputData[i]=="0"){
			if(starDot){
                res1+=inputData[i];
			}
		}else{
			res1+=inputData[i];
		}
		if(inputData[i]=="."){
			starDot=true;
		}
		}
		if(res1==".00"){
		return "0";
		}
		if(res1[0]=="."){
		return "0"+res1;
		}
		return res1;
	}

如下解释


  1. 为什么要newMscomm

    ,网上有很多把MSComm用object写入到代码中,MSComm1_OnComm事件会用script触发,在页面加载后会执行,就必须要求串口确定,我这里连接电子称的串口是不确定的;

  2. 非正常关闭会抛异常

    当串口非正常关闭时,既没有MSComm1.PortOpen = false,当再次获取数据会存在portopen是false,但打开时ie报错已经打开,

    建议跳转链接时手动的mscomm1.PortOpen=false


    我在这里踩了个大坑


  3. 该代码仅用个别电子称

    ,市面上电子称千千万万,可能不适用与你,如果你的电子称不一样,稍作修改即可,比如波长,比如解析数的函数;



MSComm1::OnComm

最主要的就是这个函数,当串口连接成功是触发这个函数,接受数据。再通过解析就能得到数据,详情请看代码

Alt



版权声明:本文为qq_35836269原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。