WEB页获取串口数据

最近做一个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:[email protected]</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     开始监听

时间: 2024-10-14 16:23:26

WEB页获取串口数据的相关文章

js获取电子秤串口数据

需求描述:需要在web端用js获取电子秤的重量.(由于erp限制的原因只能通过js获取,不能修改html,不能引用jquery) 实现目标:电子秤面板上的数据实时反映在我们公司内部erp系统界面上. 通常实现步骤: 首先要从web端获取串口数据需要用到activex(由于我们目前这个需求只需要考虑在IE浏览器下的正常运行) 网上关于对这个控件的调用一般是这样写的 <object classid="clsid:648A5600-2C6E-101B-82B6-000000000014"

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

从web中获取json数据直接进行处理总认为太慢.主要是从web中获取获取数据的过程有点慢. 所以就在想 假设先利用空暇时间把json数据获取并保存到本地,然后再从本地文件里读取和操作.应该就要快非常多. 这中间的主要问题就是格式的转换问题:1.将获取取的json数据序列化后保存到本地文件里:2.从文件里逐行读取数据,再将其反序列化为json格式. 详细的一个演示样例程序例如以下: [为保护个人信息,程序中的一些代码不完整] from urllib.request import urlopen;

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

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源代码传送:http://dwz.cn/Nret1 在iPhone和后台系统的通信中,使用Web Service获取server数据上最常见的一

Web Api 获取post json数据

这周在做一个webApi的模拟后台.遇到些问题.和大家分享一下,以前没有搞过webapi.所以不是太懂. 当我发post请求的json数据过来的时候,如果我用context.Request .Form去收的时候会发现,一小半的json数据跑到了Key里面,其他数据在form[0]中,很奇怪.后来恍然大悟我发送的又不是表单干嘛用表单去接收,然后去用HttpContext.Current.Request.InputStream.Read(byts, 0, byts.Length);直接读取流然后再转

Context域从web.xml获取数据学习笔记

web.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="h

Ajax 跨域请求 jsonp获取json数据

遇到Ajax的跨域请求出问题 找了中解决办法如下: 参考内容:http://justcoding.iteye.com/blog/1366102 由于受到浏览器的限制,该方法不允许跨域通信.如果尝试从不同的域请求数据,会出现安全错误.如果能控制数 据驻留的远程服务器并且每个请求都前往同一域,就可以避免这些安全错误.但是,如果仅停留在自己的服务器上,Web 应用程序还有什么用处呢?如果需要从多个第三方服务器收集数据时,又该怎么办? 理解同源策略 同源策略阻止从一个域上加载的脚本获取或操作另一个域上的

串口数据上传下发

1 import gnu.io.CommPortIdentifier; 2 import gnu.io.NoSuchPortException; 3 import gnu.io.PortInUseException; 4 import gnu.io.SerialPort; 5 import gnu.io.SerialPortEvent; 6 import gnu.io.SerialPortEventListener; 7 import gnu.io.UnsupportedCommOperatio

asp.net 使用JS获得串口数据

使用JS获得串口数据 JavaScript语言通常是一种网页编程语言,比较适合前台的一些应用设计.对于本地设备和数据的操作有比较大的限制.由于项目的需要,我需要获得本机的串口数据并显示在web端.我们有很多中方法实现功能,在实际的操作过程中我测试两种方式获得数据.第一种方法是使用ActiveX控件,JS调用MSCOMM32.dll的串口控件对串口进行控制.第二种方法是使用C#语言的控件对串口进行控制,然后使用JS+AJAX与C#进行交互获得串口数据. 先说说两种方法各自的特点:方法一使用的是微软

转一下大牛的嵌入web页播放视频方法(转)

来自:http://www.cnblogs.com/bandry/archive/2006/10/11/526229.html 在Web页中嵌入Media Player的方法比较简单,只要用HTML中的<Object></Object>可以了,如下所示.<OBJECT ID="WMPlay" WIDTH=320 HEIGHT=240CLASSID="CLSID:22D6f312-B0F6-11D0-94AB-0080C74C7E95"C