本文转自: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浏览器的安全设置问题,这个网上很多参考,这里就不赘述了。

[转]js串口通信 调用MSCOMM32控件 链接电子秤的更多相关文章

  1. js串口通信 调用MSCOMM32控件 链接电子秤(完整版实现方案)

    硬件环境:RS232转USB串口线*1 电子秤*1(本人采用G&G E600Y-C型号称重仪) 电子秤原装RS232数据线*1 计算机*1 软件环境:RS232转USB串口线驱动(这个可以在串 ...

  2. C#串口通信:MSComm控件使用详解

    目  次MSComm控件两种处理通讯的方式CommPort属性RThreshold 属性CTSHolding 属性SThreshold 属性CDHolding 属性DSRHolding 属性Setti ...

  3. vs2010开发activex(MFC)控件/ie插件(三),js调用ocx控件的接口函数

    原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/50802280   js调用ocx控件的接口函数,先看demo效果:      简单测试过程 ...

  4. 『Asp.Net 组件』Asp.Net 服务器组件 内嵌JS:让自己的控件动起来

    代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...

  5. Visual studio之C#跨线程调用UI控件

    背景 当前串口通讯项目,多个线程需要同时利用richTextBoxMsg控件打印信息,直接调用会造成线程不安全,严重的时候会直接导致UI线程挂掉,因此本篇就跨线程调用UI控件做个记录. 正文 定义控件 ...

  6. WinForm用户自定义控件,在主窗体加载时出现闪烁;调用用户控件出现闪烁,需要鼠标才能够显示

    转载自:http://www.dotblogs.com.tw/rainmaker/archive/2012/02/22/69811.aspx 解决方案: 在调用用户控件的窗体里面添加一下代码: pro ...

  7. 在WPF中调用Winform控件

    最近在项目中用到了人脸识别和指纹识别,需要调用外部设备和接口,这里就用到了在WPF中调用Winform控件. 第一步,添加程序集引用.System.Windows.Forms和WindowsForms ...

  8. 袁创:使用反射动态调用ActiveX控件

    ■■■■前言 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一般是使用vs.net工具自动生成的互操作性程序集.这种方法操作简单, ...

  9. 使用反射动态调用ActiveX控件

    使用反射动态调用ActiveX控件 袁永福 2018-3-2 ■■■■问题描述: 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一 ...

随机推荐

  1. Java工具eclipse控制台console输出乱码问题

    捣鼓了一下午,终于tm解决! 我的是Scanner读入,println打印乱码问题. 首先在cmd窗口运行java,是没有乱码问题的,这证明了在cmd窗口时Scanner输入的和println打印的编 ...

  2. 使用rsync实现不同Linux服务器间目录同步

    实现目标:    A 服务器上 /opt/web 目录,与B服务器上 /opt/web目录实现同步.即:B主动与A进行同步.   OS: Reaht AS4   A Server  192.168.1 ...

  3. Apache Tomcat Eclipse Integration

    An Illustrated Quick Start Guide Apache Tomcat makes hosting your applications easy. The Eclipse IDE ...

  4. GC调优

    Gc调优的目标:1.降低停顿时间 2.提高吞吐量 3.避免full-gc 调优可以使用的手段:1.各个内存区的大小调整:堆,年轻代,老年代,方法区等等2.减少短暂对象的存活时间,提高长期对象的复用率( ...

  5. spark随笔

    spark基于RDD成功构建起大数据处理的一体化解决方案,将MappReduce.Streaming.SQL.Machine Learning.Graph Processing等 大数据计算模型统一到 ...

  6. 4-Django开发post、get接口

    一.创建django应用程序 方法一:创建django项目时直接创建应用程序 方法二:命令行创建 1.进入manage.py所在目录 2.执行常见命令:python manage.py startap ...

  7. #254 Reverse a String

    翻转字符串 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. 你的结果必须得是一个字符串 这是一些对你有帮助的资源: Global String Object ...

  8. Bootstrap3.3.7

    页面的布局 <-!不让文字超出左右屏幕--> <style> .demo { word-wrap: break-word; } </style> 他们为那个模板中的 ...

  9. day19_雷神_django第二天

    django_day02 Django的路由系统 URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 1.URLconf配置 基本 ...

  10. VSCode插件开发全攻略(五)跳转到定义、自动补全、悬停提示

    更多文章请戳VSCode插件开发全攻略系列目录导航. 跳转到定义 跳转到定义其实很简单,通过vscode.languages.registerDefinitionProvider注册一个provide ...