MSComm1串口连接电子称重仪
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;
}
如下解释
-
为什么要newMscomm
,网上有很多把MSComm用object写入到代码中,MSComm1_OnComm事件会用script触发,在页面加载后会执行,就必须要求串口确定,我这里连接电子称的串口是不确定的; -
非正常关闭会抛异常
当串口非正常关闭时,既没有MSComm1.PortOpen = false,当再次获取数据会存在portopen是false,但打开时ie报错已经打开,
建议跳转链接时手动的mscomm1.PortOpen=false
我在这里踩了个大坑
; -
该代码仅用个别电子称
,市面上电子称千千万万,可能不适用与你,如果你的电子称不一样,稍作修改即可,比如波长,比如解析数的函数;
MSComm1::OnComm
最主要的就是这个函数,当串口连接成功是触发这个函数,接受数据。再通过解析就能得到数据,详情请看代码
版权声明:本文为qq_35836269原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。