• [转]js串口通信 调用MSCOMM32控件 链接电子秤


    本文转自:https://www.cnblogs.com/x-j-p/p/7819724.html

    硬件环境:RS232转USB串口线*1

         电子秤*1(本人采用G&G E600Y-C型号称重仪)

         电子秤原装RS232数据线*1

         计算机*1

    软件环境:RS232转USB串口线驱动(这个可以在串口线生产厂商官网网站下载,我用的是UNITEK生产的)

         windows7 (32位)

         MSCOMM32控件(这个在网上可以找到)

    实现步骤:1,安装MSCOMM32控件

           2,安装RS232转USB串口线驱动

           3,链接硬件(这里注意:需要电子秤先链接原装串口线,再用RS232转USB串口线链接原装串口线和电脑)

           4,开始编码

    编码细节:

    1,使用js初始化MSCOMM32控件

    $(function(){
      initActiveX(); // 初始化控件方法
    })
    function initActiveX(){
      try {
        msComm1 = new ActiveXObject("MSCOMMLib.MSComm.1"); // 初始化MSCOMM控件
      }catch (err) {
         console.log(err); // 初始化失败,打印错误
      }
      if ((typeof (msComm1) == "undefined") || (msComm1 == null)) { // 未初始化成功
        alert("msComm1 is null");
        return false;
      }else{ // 初始化成功
        configPort(); // 配置端口信息
        searchAndOpenPort(); // 自动搜索端口并打开端口
        return false;
      }
    }
    2,配置串口信息
    function configPort(){ // 配置端口方法
      msComm1.settings = '9600,n,8,1'; // 9600:波特率 n:奇偶位 8:数据位 1:校验位
      msComm1.OutBufferCount =0; //清空发送缓冲区
      msComm1.InBufferCount = 0; //滑空接收缓冲区
      msComm1.RThreshold=14; //这个参数很重要,这个参数配置要符合硬件设备 该参数表示接收硬件设备多少位数据的时候触发onComm事件
    }
    3,自动搜索计算机串口并打开串口(如果计算机连接两个硬件,参考思路即可)
    自动索搜计算机串口的思路:一般电脑最多只有16个串口,依次遍历所有串口,并向串口发送消息(我所用的设备:要求称重仪发送一次数据,
    发送十进制"27112"即可),如果接收到数据,那么说明该串口是我们需要寻找的串口。
    var com = 0; // 端口变量
    var res = ''; // 接收硬件
    function searchAndOpenPort(){
      if(msComm1.PortOpen == true){
        toggglePort(); // 关闭或者打开端口
      }
      if(com > 16){ // 一般电脑只有16个端口
        com = 0;
        alert("未连接称重仪!")
        return;
      }
      if(res != ''){ // res为接收到称重仪的数据 后面会讲到如何接收
        msComm1.CommPort = com - 1; // 设置串口为搜索到的串口
        toggglePort();
        return;
      }
      msComm1.CommPort = com; // 设置串口
      var b = toggglePort(); // 打开串口 并返回打开结果
      if(b){
        send('27,112'); // 向串口发送信息
      }
      com += 1;
      setTimeout('searchAndOpenPort()', 500); // 间隔500ms等待接收数据 并实现循环,如果不间隔时间,受代码执行顺序影响,将接受不到数据
    }
    4,打开/关闭串口
    说明:
    msComm1.PortOpen = true; 表示打开串口 如果等于false表示关闭串口
    var statu = msComm1.PortOpen 表示获取串口当前开关的状态; statu == true表示当前开启; statu == false表示当前关闭
    function toggglePort(){
      if(msComm1.PortOpen == false){
        try {
          msComm1.PortOpen = true; // 开启串口
          bindEvent(); //开启串口后绑定串口收发事件
          return true;
        }catch(ex){
          console.log(ex);
          return false;
        }
      }else{
        try {
          msComm1.PortOpen = false; // 关闭串口
          return true;
        }catch(ex){
          alert(ex.message);
          return false;
        }
      }
    }
    5,接收/发送串口消息事件绑定
    var bindEvent = function () {
      function msComm1::OnComm(){
        msComm1_event(); // 触发收发事件后的处理方法
      }
    }
    6, 串口收发事件
    function msComm1_event(){
      //console.log(msComm1.CommEvent); // 这个是在触发收发事件后返回的标志 1:表示发送;
                           // 2:表示接受 
                           // 其他的标识线变等信息(线变具体信息需要参照MSCOMM的API)
      if(msComm1.CommEvent == 1){
        alert("Send OK!");
      }else if(msComm1.CommEvent == 2){
        Receive(); // 接收串口信息方法
      }
    }
    7,接收串口信息方法
    function Receive() {
      var inputvalue = msComm1.Input; // 接收串口信息
      // console.log("input:::" + inputvalue);
      if(inputvalue.indexOf("g")>0){ // 如果返回数据包含g
        res = $.trim(inputvalue.split("g")[0]); // 取得重量并赋值给res
      }
    }
    8,向串口发送消息
    说明:串口不能接受十进制数据,而js中又没有char类型的数据,这里我们用String.fromCharCode()方法将十进制数据转为char类型
    function send(str){
      var cmd_send = '';
      try{
        var results = str.split(',');
        for(var i=0;i<results.length;i++) {
          cmd_send += String.fromCharCode(results[i]); // 十进制转char
        }
        msComm1.Output=cmd_send; // 向串口发送消息
      }catch(ex){
        console.log(ex.message);
      }
    }
    9,点击获取称重仪数据的方法
    function getWeight(){
      if(com == '0'){
        alert("未连接称重仪!")
      }else{
        send('27,112'); // 向串口发送一次请求
        setTimeout("auto_weight_once()", 200); // 200ms后接收数据,这里设置200ms后再获取很有必要,这个是执行顺序问题
      }
    }
    function auto_weight_once(){
      $("#weight").val(res); // 填充获取的数据到页面
    }
    10,称重仪持续输出数据的方法
    function auto_weight(){
      // if(!continue_auto_weight){ // 这里是结束持续输出的标志,至于什么时候结束, 可根据项目而定
      // return;
      // }
      $("#weight").val(res);
      send('27,112');
      setTimeout("auto_weight()", 200);
    }
    小结:关于goole如何连接称重仪,有时间再写帖子。
    最后:如果还不能解决问题,那么就可能是ie浏览器的安全设置问题,这个网上很多参考,这里就不赘述了。

  • 相关阅读:
    四十一:HTML5之HTML5属性变化之input新增类型
    四十:HTML5之HTML5标签变化之删除的标签和重定义的标签
    三十九:HTML5之HTML5标签变化之新增的其他标签和简单的使用示例
    三十八:HTML5之HTML5标签变化之新增的web应用标签和简单的使用示例
    三十七:HTML5之HTML5标签变化之新增的多媒体标签和简单的使用示例
    三十六:HTML5之HTML5标签变化之新增的结构标签和简单的使用示例
    三十五:布局之布局小案例
    python初识-day2
    Python初识-day1
    leetcode maximum product subarray
  • 原文地址:https://www.cnblogs.com/freeliver54/p/10008702.html
Copyright © 2020-2023  润新知