js串口通信 调用MSCOMM32控件 链接电子秤(完整版实现方案)
硬件环境: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控件 链接电子秤(完整版实现方案)的更多相关文章
- [转]js串口通信 调用MSCOMM32控件 链接电子秤
本文转自:https://www.cnblogs.com/x-j-p/p/7819724.html 硬件环境:RS232转USB串口线*1 电子秤*1(本人采用G&G E600Y-C型号称重仪 ...
- C#串口通信:MSComm控件使用详解
目 次MSComm控件两种处理通讯的方式CommPort属性RThreshold 属性CTSHolding 属性SThreshold 属性CDHolding 属性DSRHolding 属性Setti ...
- vs2010开发activex(MFC)控件/ie插件(三),js调用ocx控件的接口函数
原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/50802280 js调用ocx控件的接口函数,先看demo效果: 简单测试过程 ...
- 『Asp.Net 组件』Asp.Net 服务器组件 内嵌JS:让自己的控件动起来
代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...
- Visual studio之C#跨线程调用UI控件
背景 当前串口通讯项目,多个线程需要同时利用richTextBoxMsg控件打印信息,直接调用会造成线程不安全,严重的时候会直接导致UI线程挂掉,因此本篇就跨线程调用UI控件做个记录. 正文 定义控件 ...
- C#调用OCX控件的常用方法[转]
小伙伴们在使用ICP提供的各种能力进行集成开发时常常会遇到一些技术上的困扰,例如ICP中很多接口是通过OCX控件的方式提供的,如何调用这些接口,就成了一个不大不小的问题,毕竟开发指南上可没这些内容啊~ ...
- WinForm用户自定义控件,在主窗体加载时出现闪烁;调用用户控件出现闪烁,需要鼠标才能够显示
转载自:http://www.dotblogs.com.tw/rainmaker/archive/2012/02/22/69811.aspx 解决方案: 在调用用户控件的窗体里面添加一下代码: pro ...
- Delphi下使用Oracle Access控件组下TOraSession控件链接
Delphi下使用Oracle Access控件组下TOraSession控件链接数据库,使用 orsn1.Options.Direct:=true; orsn1.Server:=IP:Port: ...
- 在WPF中调用Winform控件
最近在项目中用到了人脸识别和指纹识别,需要调用外部设备和接口,这里就用到了在WPF中调用Winform控件. 第一步,添加程序集引用.System.Windows.Forms和WindowsForms ...
随机推荐
- Chapter3_操作符_方法调用中的别名问题
接下来展示方法调用中的别名问题,方法调用中的别名问题指的是,将一个对对象的引用传递给某一个方法时,方法操作的是这一个特定的引用而不是这个引用的拷贝. class Person{ float heigh ...
- java8新特性forEach在Map和List的应用
转自:https://www.cnblogs.com/go-onxp/p/jdk8.html java8 forEach 在Map和List中的使用 原始的使用 Map<String, Inte ...
- day30
作业 #__author : 'liuyang' #date : 2019/4/11 0011 下午 12:36 # 这两天 1.软件开发规范 不写 没法做新作业 #2. 认证+上传 +下载 + 校验 ...
- Django的学习进阶(二)———— name
一.问题: 在做完第一个demo的时候,由于只是基础学习,所以对于name的使用并不需要很熟练,也不用理解的很深.但是在做音乐网站的时候遇到了关于如何使用name的内容. 由于一个app中会使用到另一 ...
- 2019.02.14 codechef Chef at the Food Fair(线段树+泰勒展开)
传送门 题意:现在有nnn个位置,每个位置上有一个值aia_iai. 要求支持如下两种操作: 区间乘vvv 求区间的(1−ai)(1-a_i)(1−ai)之积 思路: 考虑转换式子: Ans=∏i ...
- C++ MFC棋牌类小游戏day4
根据昨天的计划,今天开始做下面的内容. 1.鼠标点击事件 2.点击坐标进行处理.(坐标转换) 3.判断选中的位置是否有效. 4.确定选中的棋子,设置棋子的状态和棋子所在坐标的状态. 5.判断移动是否有 ...
- spring生命周期流程图
Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...
- liunx----配置搜狗输入法
话不多说直接看步骤 * 系统版本: ubuntu 18.04.1 // 查看命令为: # cat /etc/issue 1. 先查看当前系统是否存在 fcitx 框架: # dpkg -l | gre ...
- 人生苦短之---第一个Python程序
第一个 Python 程序 目标 第一个 HelloPython 程序 Python 2.x 与 3.x 版本简介 执行 Python 程序的三种方式 解释器 —— python / python ...
- java项目使用mvn打包时,出现数据库连接错误
原因: maven在install的时候会默认去执行test包下的test示例,导致打包失败,只需要把测试注释掉就可以了包括类上的注解,或者在install的时候跳过测试,install -Dmave ...