本文转自: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. jasperreports实现pdf文档的生成

    1.导入jar包(pom.xml构建) <dependencies> <dependency> <groupId>com.lowagie</groupId&g ...

  2. outlook VSTO

    https://files.cnblogs.com/files/maooveyu/OutlookPhotoSync.rar

  3. 中触发一个断点 其原因可能是堆被损坏,这说明 ***.exe 中或它所加载的任何 DLL 中有 Bug

    软件中使用了DevComponents.DotNetBar2.dll MessageBoxEx.Show("ddd");运行到这句出现这个错误 : 中触发一个断点 其原因可能是堆被 ...

  4. linux和windows共享目录

    常用的samba共享 1.安装samba:可以先检查下是否已经安装:rpm -qa | grep samba,没安装直接yum,安装命令:yum install samba 2.创建共享文件夹 mkd ...

  5. day_10初级函数

    今天讲了函数初级 函数:完成特定功能的代码块,作为一个整体对其进行特定的命名,该名字就是代表函数 --现实中很多问题要通过一些工具进行处理 ,,可以将工具提前准备好并命名 通过名字就可以找到这个工具 ...

  6. Using iSCSI On Ubuntu 10.04 (Initiator And Target)

    This guide explains how you can set up an iSCSI target and an iSCSI initiator (client), both running ...

  7. 微信小程序 - 相对定位和绝对定位 - 相对路径和绝对路径

    微信小程序 - 相对定位和绝对定位 相对定位relative,绝对定位absolute 相对定位:元素是相对自身进行定位,参照物是自己. 绝对定位:元素是相对离它最近的一个父级元素进行定位. 相对定位 ...

  8. Ubuntu 16.04下GDB调试

    在linux中还有一个更受大家欢迎的调试工具:GDB.GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具.可以用来调试C,C++程序. GDB功 ...

  9. [Oracle]使用InstantClient访问Oracle数据库

    环境 操作系统: Win8.1 Enterprise Oracle开发工具: PL/SQL Developer 7.0.1.1066 (MBCS) 步骤 下载InstantClient Oracle官 ...

  10. [源码]Python简易http服务器(内网渗透大文件传输含下载命令)

    Python简易http服务器源码 import SimpleHTTPServerimport SocketServerimport sysPORT = 80if len(sys.argv) != 2 ...