js获取电子秤串口数据

需求描述:需要在web端用js获取电子秤的重量。(由于erp限制的原因只能通过js获取,不能修改html,不能引用jquery)

实现目标:电子秤面板上的数据实时反映在我们公司内部erp系统界面上。

通常实现步骤:

首先要从web端获取串口数据需要用到activex(由于我们目前这个需求只需要考虑在IE浏览器下的正常运行)

网上关于对这个控件的调用一般是这样写的

<object classid="clsid:648A5600-2C6E-101B-82B6-000000000014" id="MSComm1" codebase="MSCOMM32.OCX"
    type="application/x-oleobject" style="left: 54px; top: 14px">
    <param name="CommPort" value="4">
    <!--设置并返回通讯端口号。-->
    <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="?">
    <param name="RThreshold" value="1">
    <param name="RTSEnable" value="1">
    <param name="SThreshold" value="2">
    <param name="EOFEnable" value="0">
    <param name="InputMode" value="0">
    <!--comInputModeText 0 (缺省) 通过 Input 属性以文本方式取回数据。comInputModeBinary 1  通过 Input 属性以二进制方式检取回数据。-->
    <param name="DataBits" value="8">
    <param name="StopBits" value="1">
    <param name="BaudRate" value="38400">
    <param name="Settings" value="38400,N,8,1">
</object>

而由于前面所说的我们erp的限制,我无法修改html文件,因此无法在html文件中添加对MSCOMM32.dll的引用。因此我是用如下方法实现的:

//创建MSComm对象
function uf_GetSerPortData()
{
    try
    {
        MSComm1 = new ActiveXObject("MSCOMMLib.MSComm.1");
        if ((typeof (MSComm1) == "undefined") || (MSComm1 == null))
        {
            alert("创建MSComm1对象失败!");
        }
        else
        {
            //绑定事件
            fn();
        }
    }
    catch (err)
    {
        alert(err.description);
    }
}

var fn=function(){
    function MSComm1::OnComm() {
        MSComm1_OnComm();
    }
}

在这里有两个地方需要解释一下:

  1. 打开端口的时候提示创建对象失败

    如果后面设置MSComm1的PortOpen提示失败时,就需要添加对MScomm控件的注册。具体的注册方法在如下链接里面有详细说明:http://jingyan.baidu.com/article/375c8e19a2953b25f2a22986.html

    需要注意的是链接中给出的是32位系统的解决方案,对于64位系统路径可能有所不同。需要用户根据自己的系统情况进行修改。

  2. 绑定控件的事件:
    我目前所使用的电子秤有两种输出模式,一种是连续输出打印的一种是在屏幕上按键打印输出的。现在我们讨论在连续输出模式下的问题。由于是连续输出因此我们需要对电子秤的输出做一个事件绑定,并且通过一个回调函数来实现获取重量数据后在erp中进行对应的数据展示。一般我们可以通过诸如下面的代码来实现事件绑定
<script   language="javascript"   for="window"   event="onload">

  ......

</script>

但是由于无法修改html代码,仅仅只能修改js代码的限制,我们现在无法通过这种方式实现事件绑定。(我也想过通过js动态在html中插入这段引用,但实际结果并没有触发事件,不知道是由于加载顺序的原因,还是erp本身对于这块的安全限制)因此我们只能另寻他法.在这里就用到了下面的代码了

function uf_GetSerPortData()
{
    try
    {
        MSComm1 = new ActiveXObject("MSCOMMLib.MSComm.1");
        if ((typeof (MSComm1) == "undefined") || (MSComm1 == null))
        {
            alert("创建MSComm1对象失败!");
        }
        else
        {
            //绑定事件
            fn();
        }
    }
    catch (err)
    {
        alert(err.description);
    }
}

var fn=function(){
    function MSComm1::OnComm() {
        MSComm1_OnComm();
    }
}

对于 function MSComm1::OnComm() 这种写法,我之前从没见过,后来是在一篇博文上面看到的,试了下发现真的可以实现,事件绑定。这样就完成了在js中进行事件绑定了。后面的回调函数显示重量数值就很简单了。

下面贴上实现的完整代码(直接从实现demo当中抠出来的,关于数值显示的地方代码丑陋大家略过就行。但肯定是可以实现需求的,已经测试过)

//创建MSComm对象
function uf_GetSerPortData()
{
    try
    {
        MSComm1 = new ActiveXObject("MSCOMMLib.MSComm.1");
        if ((typeof (MSComm1) == "undefined") || (MSComm1 == null))
        {
            alert("创建MSComm1对象失败!");
        }
        else
        {
            //绑定事件
            fn();
        }
    }
    catch (err)
    {
        alert(err.description);
    }
}

var fn=function(){
    function MSComm1::OnComm() {
        MSComm1_OnComm();
    }
}

//事件响应
function   MSComm1_OnComm()
{
    switch(MSComm1.CommEvent)
    {
        case 1:{ window.alert("Send OK!"); break;}  //发送事件
        case 2: { Receive();break;} //接收事件
        default: alert("Event Raised!"+MSComm1.CommEvent);;
    }
}

function OperatePort()
{
    if(MSComm1.PortOpen==true)
    {
        try{MSComm1.PortOpen=false;
            SKButton1.value="打开串口";
        }catch(ex)
        {alert(ex.message);}
    }
    else{
        try{ MSComm1.PortOpen=true;
            MSComm1.InBufferCount = 0;
            SKButton1.value="关闭串口";
        }catch(ex)
        {alert(ex.message);}
    }
}

function ConfigPort()
{
    var comport="";
    var boundRate="";
    var jiaoyanwei="";
    var shujuwei="";
    var tingzhiwei="";
    comport=SKDBcombobox1.value;
    boundRate=SKDBcombobox2.value;
    jiaoyanwei=SKDBcombobox3.value;
    shujuwei=SKDBedit5.value;
    tingzhiwei=SKDBedit6.value;

    if(MSComm1.PortOpen==false)
    {
        try{
            /*
                MSComm1.CommPort=comport;
                MSComm1.Settings=boundRate+","+jiaoyanwei+","+shujuwei+","+tingzhiwei;
                MSComm1.OutBufferCount =0;           //清空发送缓冲区
                MSComm1.InBufferCount = 0;           //滑空接收缓冲区
             */
            MSComm1.CommPort="4";
            switch(SKDBcombobox1.value)
            {
                case "COM1":
                    MSComm1.CommPort="1";
                    break;
                case "COM2":
                    MSComm1.CommPort = "2";
                    break;
                case "COM3":
                    MSComm1.CommPort = "3";
                    break;
            }

            MSComm1.Settings="9600"+
                                 ","+"n"+
                                 ","+"8"+
                                 ","+"1";
            MSComm1.OutBufferCount =0;           //清空发送缓冲区
            MSComm1.InBufferCount = 0;           //滑空接收缓冲区
            MSComm1.RThreshold=1;                    //接收一个字节就触发omcom事件

            alert("已配置串口COM"+MSComm1.CommPort+"\n 参数:"+MSComm1.Settings);
        }catch(ex){alert(ex.message);}
    }
    else{ alert("请先关闭串口后再设置!");}
}
var tmpWeight = "";

//接收数据
function Receive()
{
    //alert("InBufferCount::"+MSComm1.InBufferCount);
    var inputvalue = MSComm1.Input;

    if (inputvalue.indexOf(‘g‘) >= 0) {
        return;
    }
    // alert(inputvalue);

    tmpWeight+=inputvalue.replace(‘-‘, ‘‘);

    if(tmpWeight.length>16)
    {
        if(tmpWeight.indexOf(‘000‘))
        {
            var weight=trim(tmpWeight.substr(5,5));
            if(weight.indexOf(‘0‘)==0)
            {
                weight=weight.replace("0","0.")
            }
            SKDBedit7.value=weight;
            tmpWeight="";
        }

    }

    //alert("InBufferCount::"+MSComm1.InBufferCount);
}
/*
var weight;
var myArray=new Array();
function GetWeight()
{

}
*/
function serPortInit()
{
    SKDBcombobox1.value="COM4";
    SKDBcombobox2.value="9600";
    SKDBcombobox3.value="无NONE";
    SKDBedit5.value="8";
    SKDBedit6.value="1";

    //初始化创建MSComm1对象
    uf_GetSerPortData();
}

function trim(str){ //删除左右两端的空格
    return str.replace(/(^\s*)|(\s*$)/g, "");
}
function ltrim(str){ //删除左边的空格
    return str.replace(/(^\s*)/g,"");
}
function rtrim(str){ //删除右边的空格
    return str.replace(/(\s*$)/g,"");
}
时间: 2024-08-09 13:57:19

js获取电子秤串口数据的相关文章

JS获取table列数据

/** * js 获取按钮所在行每一列的数据,返回包含每一列数据的数组 * @param node * @returns {Array} */ function getTableTdValue(node) { // 按钮在td里面,其父节点的父节点是tr. var tr = node.parentNode.parentNode; var trArray = new Array(); for(var i=0; i<tr.cells.length; i++){ trArray[i] = tr1.ce

Node.js获取GET/POST数据

目标:使用Node.js搭建简单服务器提供简单接口,达到两数字加减乘除计算并返回json结果.(通用GET/POST) 知识点 获取GET数据 获取POST数据 了解监听事件 实现 var http = require("http"); //提供web服务 var url = require("url"); //解析GET请求 var query = require("querystring"); //解析POST请求 //服务 var serv

js获取表单数据

曾经尝试了很多方法,网上也推荐了好多方法.一般都是:document.getElementById('mail').value 但是我尝试了好多次,返回值都是空 最后找到一个方法比较可行,而且获取表单的所有input都很方便: document.JSRegistForm.RegistUsername.value 下面列出我的源代码: <form action="zhuce.jsp" method="post" name="JSRegistForm&q

js 获取 ajax返回数据及处理

$.ajax({ url: "http://xiaocui.dgoods.cn/app/index.php?i=5&c=entry&do=check&m=stonefish_bigwheel", type: "POST", data:{'mdcode':param}, dataType:"json", async: true, success: function (succ) { var num = succ[0].sca

《项目经验》--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

  先看一下我要实现的功能界面:   这个界面的功能在图中已有展现,课程分配(教师教授哪门课程)在之前的页面中已做好.这个页面主要实现的是授课,即给老师教授的课程分配学生.此页面实现功能的步骤已在页面中有所体现,这里不再赘述,此篇文章主要介绍:我是如何通过js从前台获取数据,然后通过ajax技术向后台一般处理程序传递JSON,后台又是如何获取传来的JSON,并对JSON数据转换,然后将转换后的数据写入数据库的! 介绍这些步骤实现前,先说说自己的辛酸:絮叨辛酸,是因为为了实现这个功能,我真的用了很

通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中  先看一下我要实现的功能界面:   这个界面的功能在图中已有展现,课程分配(教师教授哪门课程)在之前的页面中已做好.这个页面主要实现的是授课,即给老师教授的课程分配学生.此页面实现功能的步骤已在页面中有所体现,这里不再赘述,此篇文章主要介绍:我是如何通过js从前台获取数

WEB页获取串口数据

最近做一个B/S的项目,需要读取电子秤的值,之前一直没做过,也没有经验,于是在网上找到很多  大致分两种 使用ActiveX控件,JS调用MSCOMM32.dll的串口控件对串口进行控制 使用C#语言的控件对串口进行控制,然后使用JS+AJAX与C#进行交互获得串口数据 详情见  使用JS获得串口数据 http://blog.csdn.net/xuing/article/details/6688306    但是小弟用这两种办法都获取到数据 串口配置如下: 1 serialPort1.PortN

asp.net 使用JS获得串口数据

使用JS获得串口数据 JavaScript语言通常是一种网页编程语言,比较适合前台的一些应用设计.对于本地设备和数据的操作有比较大的限制.由于项目的需要,我需要获得本机的串口数据并显示在web端.我们有很多中方法实现功能,在实际的操作过程中我测试两种方式获得数据.第一种方法是使用ActiveX控件,JS调用MSCOMM32.dll的串口控件对串口进行控制.第二种方法是使用C#语言的控件对串口进行控制,然后使用JS+AJAX与C#进行交互获得串口数据. 先说说两种方法各自的特点:方法一使用的是微软

js添加的表单在火狐下获取不到数据的解决方法

相信很多朋友在进行网页制作的时候都会遇到过这样的问题:就是用js在表单内添加数据控件之后:在火狐下获取不到数据的问题. 前几天,我在开发一个使用js添加数据填写项的时候,也出现了这样的问题:一开始我还以为是火狐下ajax加载数据出了问题(因为在ie下可以正常的获取到数据):经过测试原来并是这样的问题,而是form放得位置不同, 在form和table结合使用的时候,很多朋友都喜欢这样放: <table>                <form>