本文转自:https://www.cnblogs.com/rockyhm/p/3434200.html

最近做一个B/S的项目,需要读取电子秤的值,之前一直没做过,也没有经验,于是在网上找到很多  大致分两种

  1. 使用ActiveX控件,JS调用MSCOMM32.dll的串口控件对串口进行控制
  2. 使用C#语言的控件对串口进行控制,然后使用JS+AJAX与C#进行交互获得串口数据

详情见  使用JS获得串口数据 http://blog.csdn.net/xuing/article/details/6688306    但是小弟用这两种办法都获取到数据

串口配置如下:

1                  serialPort1.PortName = "COM1";          //端口名称
2 serialPort1.BaudRate = 1200; //波特率
3 serialPort1.Parity = Parity.None; //奇偶效验
4 serialPort1.StopBits = StopBits.One; //效验
5 serialPort1.DataBits = 8; //每个字节的数据位长度

最后换种思路:使用C#写一个ActiveX控件(吉日老师提醒)最后嵌入网页中读取数据   如下:

  1. 第一步:新建项目,如下图,选择windows下的类库项目。
  2. 在项目中添加一个类:IObjectSafety.cs 
  3. IObjectSafety.cs代码如下:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    namespace MyActive
    {
    //Guid唯一,不可变更,否则将无法通过IE浏览器的ActiveX控件的安全认证
    [ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IObjectSafety
    {
    [PreserveSig]
    void GetInterfacceSafyOptions(int riid,out int pdwSupportedOptions,out int pdwEnabledOptions);
    }
    }
  4. 添加一个用户控件 MyActiveXControl.cs 
  5. 修改 MyActiveXControl.cs 代码,让其继承IObjectSafety,定义相应的Guid,该Guid就是ActiveX的classid 
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices; namespace MyActiveX
    {
    [Guid("218849AF-1B2C-457B-ACD5-B42AC8D17EB7"), ComVisible(true)]
    public partial class MyActiveXControl : UserControl,IObjectSafety
    {
    public MyActiveXControl()
    {
    InitializeComponent();
    } #region IObjectSafety 成员 用于ActiveX控件安全信任
    public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
    {
    pdwSupportedOptions = 1;
    pdwEnabledOptions = 2;
    } public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
    {
    throw new NotImplementedException();
    }
    #endregion
    }
    }

    至此   Active控件制作完毕      下面我们添加文本框、按钮、SerialPort、Timer控件进行测试                                     

  6. 添加响应的事件代码如下
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.IO.Ports;
    using System.Text;
    using System.Threading;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using MyActive; namespace MyActiveX
    {
    //不可改变
    [Guid("218849AF-1B2C-457B-ACD5-B42AC8D17EB7"), ComVisible(true)]
    public partial class MyActiveXControl : UserControl, IObjectSafety
    { public MyActiveXControl()
    {
    InitializeComponent();
    } public delegate void HandleInterfaceUpdataDelegate(string text);//定义一个委托 private HandleInterfaceUpdataDelegate interfaceUpdataHandle;//声明 bool isClose = false;//是否关闭 #region IObjectSafety 成员 用于ActiveX控件安全信任
    public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
    {
    pdwSupportedOptions = 1;
    pdwEnabledOptions = 2;
    } public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
    {
    throw new NotImplementedException();
    }
    #endregion private void button1_Click(object sender, EventArgs e)
    {
    try
    {
    interfaceUpdataHandle = new HandleInterfaceUpdataDelegate(UpdateTextBox);//实例化委托对象 serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
    if (!serialPort1.IsOpen)
    {
    serialPort1.Open();
    }
    button2.Enabled = true;
    button1.Enabled=false;
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    return;
    }
    timer1.Enabled = true; }
    /// <summary>
    /// 控件加载事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MyActiveXControl_Load(object sender, EventArgs e)
    {
    setOrgComb();
    }
    /// <summary>
    /// 初始化串口
    /// </summary>
    private void setOrgComb()
    {
    serialPort1.PortName = "COM1"; //端口名称
    serialPort1.BaudRate = 1200; //波特率
    serialPort1.Parity = Parity.None; //奇偶效验
    serialPort1.StopBits = StopBits.One; //效验
    serialPort1.DataBits = 8; //每个字节的数据位长度
    }
    /// <summary>
    /// 更新数据
    /// </summary>
    /// <param name="text"></param>
    private void UpdateTextBox(string text)
    {
    //richTextBox1.Text = text + "\n\t" + richTextBox1.Text;
    richTextBox1.Text = text;
    } /// <summary>
    /// 接收数据是发生
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
    //获取接收缓冲区中数据的字节数
    if (serialPort1.BytesToRead > 5)
    { string strTemp = serialPort1.ReadExisting();//读取串口
    double weight = -1;//获取到的重量
    foreach (string str in strTemp.Split('='))//获取稳定的值
    {
    double flog = 0;
    //数据是否正常
    if(double.TryParse(str, out flog)&&str.IndexOf('.')>0&&str[str.Length-1]!='.')
    {
    //数据转换 串口获取到的数据是倒叙的 因此进行反转
    char[] charArray = str.ToCharArray();
    Array.Reverse(charArray);
    string left = new string(charArray).Split('.')[0];
    string right = new string(charArray).Split('.')[1];
    if (right.Length==2)
    {
    weight = int.Parse(left) + int.Parse(right) / 100.0;
    }
    }
    }
    if(weight>=0)
    {
    //在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托。
    this.Invoke(interfaceUpdataHandle, weight.ToString());//取到数据 更新
    }
    }
    } private void button2_Click(object sender, EventArgs e)
    {
    try
    {
    button1.Enabled = true;
    button2.Enabled = false;
    serialPort1.Close();
    timer1.Enabled = false; }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    } private void timer1_Tick(object sender, EventArgs e)
    {
    if (isClose)
    {
    return;
    }
    try
    {
    string send = "" + (char)(27) + 'p';
    send = serialPort1.ReadExisting();
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    button2_Click(null, null);
    }
    }
    }
    }
  7. 至此读取串口数据的Active控件制作完毕   下面我们来制作一个安装包,新建一个安装项目
  8. 在安装项目的文件系统中添加刚才之前我们制作的ActiveX的DLL:MyActiveX.dll
    (特别注意:在文件添加进来后,右击文件选择属性,设置其属性Register值为:vsdraCOM)

9.    生成安装程序,在项目MyActiveX\Setup1\Debug下找到Setup1.msi,双击安装它。
         然后在该目录下新建一个html文件(test.html)用于测试我们的ActiceX控件。HTML代码如下:

<html>
<title>Powered by yyzq.net Email:yq@yyzq.net</title>
<head>
</head>
<body>
<div>
<object id="yyzq" classid="clsid:218849AF-1B2C-457B-ACD5-B42AC8D17EB7"
width="320"
height="240"
codebase="Setup1.msi">
</object>
</div>
</body>
</html>

在IE浏览器下打开test.html,点击start     开始监听

[转]WEB页获取串口数据的更多相关文章

  1. WEB页获取串口数据

    最近做一个B/S的项目,需要读取电子秤的值,之前一直没做过,也没有经验,于是在网上找到很多  大致分两种 使用ActiveX控件,JS调用MSCOMM32.dll的串口控件对串口进行控制 使用C#语言 ...

  2. 通过Places API Web Service获取兴趣点数据

    实验将爬取新加坡地区的银行POI数据 数据库采用mongodb,请自行安装,同时申请google的key 直接上代码 #coding=utf-8 import urllib import json i ...

  3. Activex在没有电子秤api的情况下获取串口数据

    大二做B/S架构的项目使用了安衡电子秤CHS-D+R和一款扫码枪,两个设备的串口使用一样,这款电子秤是相当的坑,没有开发的api,无奈只能自己开发Activex了,在B/S架构中进行引用Activex ...

  4. pyhton 从web获取json数据 保存到本地然后再读取

    从web中获取json数据直接进行处理总认为太慢.主要是从web中获取获取数据的过程有点慢. 所以就在想 假设先利用空暇时间把json数据获取并保存到本地,然后再从本地文件里读取和操作.应该就要快非常 ...

  5. iOS开发网络篇之Web Service和XML数据解析

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...

  6. Xamarin.Android 调用Web Api(通过ListView展示远程获取的数据)

    xamarin.android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问.xamarin.android调用远程数据主要有两种方式: 在Android中保存数据或调用数 ...

  7. Android学习笔记_12_网络通信之从web获取资源数据到Android

    从web获取图片信息,并显示到android的imageView控件. 一.添加网络访问权限. <uses-permission android:name="android.permi ...

  8. SpringBoot web获取请求数据【转】

    SpringBoot web获取请求数据 一个网站最基本的功能就是匹配请求,获取请求数据,处理请求(业务处理),请求响应,我们今天来看SpringBoot中怎么获取请求数据. 文章包含的内容如下: 获 ...

  9. jQuery Ajax使用FormData上传文件和其他数据,后端web.py获取

    参考博文: 通过jQuery Ajax使用FormData对象上传文件 方法一:使用<form>表单初始化FormData对象方式上传文件 前端(JQuery): <form enc ...

随机推荐

  1. 在 npm 中使用 ES6 module

    node 从 v8.5.0起 支持了 ES6 module. 只需保存文件名为 .mjs ,并通过一个option 可以开启执行,如 node --experimental-modules index ...

  2. Pi的计算

    百度百科           圆周率用希腊字母 π(读作pài)表示,是一个常数(约等于3.141592654),是代表圆周长和直径的比值.它是一个无理数,即无限不循环小数.在日常生活中,通常都用3. ...

  3. css基础回顾

    1.css选择器分类: id选择器,类选择器,通用选择器, 包含(后代)选择器——加入空格,用于选择指定标签元素下的后辈元素. 子选择器(大于符号)——用于指定标签元素的第一代子元素. 伪类选择器—— ...

  4. 使用Spring+MySql实现读写分离(二)spring整合多数据库

    紧接着上一章,因为现在做的项目还是以spring为主要的容器管理框架,所以写以下spring如何整合多个数据源. 1. 背景 我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较 ...

  5. nova compute enable password injection and filesystem resize

    root@OpenstackIcehouse2:~# cat /etc/nova/nova-compute.conf [DEFAULT] compute_driver=libvirt.LibvirtD ...

  6. 【腾讯Bugly干货分享】Android 插件技术实战总结

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/1p5Y0f5XdVXN2EZYT0AM_A 前言 安 ...

  7. Javascript高级编程学习笔记(71)—— 模拟事件(1)DOM事件模拟

    事件,指的是网页中某个特定的交互时刻 一般来说事件由浏览器厂商负责提供,一般由用户操作或者其它浏览器功能来触发 但是有一类特殊的事件,那就是由我们开发人员通过JS触发的事件 这些事件和浏览器创建的事件 ...

  8. 第七篇: 消息总线(Spring Cloud Bus)

    Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来.它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控.本文要讲述的是用Spring Cloud Bus实现通知微服务 ...

  9. Powermock2.0.0 详细 总结

    目录 1 单元测试 2 Junit测试框架 2.1 Junit是什么 2.2 Junit 能做什么? 3 Junit测试的局限性 4 Mock技术 5 相关的Mock工具 5.1 Mockito.Ea ...

  10. 远程桌面连接:出现身份验证错误,要求的函数不受支持,可能是由于CredSSP加密Oracle修正的解决方法

    在做app时需要连接服务器来进行数据交互,但是在阿里云页面里连接服务器太不好用,所以使用windows自带的远程连接来进行. 一.但是连接的过程中出现了以下问题: 二.最初是有点迷茫的,不知道从哪里下 ...